C# 全局钩子获取键值问题
大家好,我是剑走偏锋,今天实在想不通的问题,我来提上来,希望大家帮与解答,我先谢过了。首先我说下问题,我这个程序运行后,能够在系统中挂上全局钩子,因为VS.NET 2005中无法在调试的模式中
进行安装钩子,所以我只能生成后开结果。
下面是我程序出现的2个问题:
1.可以全局接受键盘输入,但是多点几次键盘后(大约15 - 20 次)后就会出现内存错误。
2.在挂全局钩子后,我接收到的 "wParam" 还有 "lParam" 值 都不是我键盘所输入的键值
请问我如何才能获取到??
呵呵 我实在想不通,希望各位牛人多多帮助 我QQ : 250623008 邮箱:g0194776@126.com
希望大家多多讨论。
===========》 以下是代码部分(完整)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.Runtime.InteropServices;
namespace API
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
SetHook(); //挂钩子
}
//安装钩子原型
[DllImport("user32.dll", EntryPoint = "SetWindowsHookEx")]
public static extern int SetWindowsHookEx(
int idHook,
MyHook lpfn,
IntPtr hmod,
int dwThreadId
);
//卸载钩子原型
[DllImport("user32.dll", EntryPoint = "UnhookWindowsHookEx")]
public static extern bool UnhookWindowsHookEx(
int hHook
);
//回调钩子信息原型
[DllImport("user32.dll", EntryPoint = "CallNextHookEx")]
public static extern int CallNextHookEx(
int hHook,
int ncode,
IntPtr wParam,
IntPtr lParam
);
public delegate int MyHook(int nCode, IntPtr wParam, IntPtr lParam); //建立委托用来回调
static int hHook = 0; //用来记录钩子编号
const int WH_KEYBOARD_LL = 13; //钩子类型
//用来做钩子事件
public int KeyBoard_HookPro(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode < 0)
{
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
else
{
try
{
this.tb1.Text += "A";
//MessageBox.Show("接收到内容 :" + wParam.ToInt32());
return 1;
}
catch (Exception ex)
{
MessageBox.Show("产生了错误 : " + ex.Message);
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
}
//此方法用来安装钩子
public void SetHook()
{
try
{
if (hHook == 0)
{
//开始安装钩子
hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
new MyHook(this.KeyBoard_HookPro),
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
0);
if (hHook == 0)
{
MessageBox.Show("Install Globle KeyBoard 's Hook Fail......");
}
else
{
button1.Text = "卸载钩子";
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "卸载钩子")
{
bool state = UnhookWindowsHookEx(hHook);
if (state)
{
button1.Text = "安装钩子";
MessageBox.Show("UnInstall Globe KeyBoard 's Hook Done!");
}
else
{
MessageBox.Show("UnInstall Globe KeyBoard 's Hook File......");
}
}
else
{
SetHook();
}
}
}
}
问题解决后马山给分,谢谢了~!
再次谢谢了 --------------------编程问答-------------------- 参考:http://blog.csdn.net/cocosoft/archive/2007/05/17/1613957.aspx
--------------------编程问答-------------------- Mark --------------------编程问答-------------------- 对于键盘钩子来说,参数的定义如下所示。
● dwCode——键盘消息的处理方式。如果是HC_ACTION,表示收到一个正常的击键消息;如果是HC_NOREMOVE,表示对应消息并没有从消息队列中移去(当某个进程用指定PM_NOREMOVE 标志的PeekMessage函数获取消息时就是如此)。
● wParam——按键的虚拟码(即Windows.inc中定义的VK_xxx值)。
● lParam——按键的重复次数、扫描码和标志等数据,不同数据位的定义如下:
■ 位0~15:按键的重复次数。
■ 位16~23:按键的扫描码。
■ 位24:按键是否是扩展键(F1与F2等Fx键,小键盘数字键等),如果此位是1表示按键是扩展键。
■ 位25~28:未定义。
■ 位29:如果Alt键在按下状态,此位置1,否则置0。
■ 位30:按键的原先状态,消息发送前按键原来是按下的,此位被设置为1,否则置0。
■ 位31:按键的当前动作,如果是按键按下,那么此位被设置为0;按键释放的话被设置为1。
补充:.NET技术 , C#