女朋友的电脑有的时候电脑的shift按键会卡住。这个是偶尔会出现的现象,有的时候重启一下又好了。反反复复这样感觉好不方便,就寻思着可以自己写一个按键屏蔽的程序来试试。网上一查,多位大牛有这方面的介绍,我就跟着试试。
这是参考的地址:http://www.csframework.com/archive/2/arc-2-20110617-1636.htm
http://www.cnblogs.com/Charles2008/archive/2010/04/05/1700094.html
http://bbs.csdn.net/topics/390205931
http://www.boluor.com/solution-to-the-keyboard-hook-function-is-executed-twice.html
C#键盘勾子(Hook),屏蔽键盘活动
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
运行机制
1、钩子链表和钩子子程:
每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程 序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。 一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始, 而最早安装的钩子放在最后,也就是后加入的先获得控制权。
Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。
钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。
钩子子程必须按照以下的语法:
LRESULT CALLBACK HookProc
(
int nCode,
WPARAM wParam,
LPARAM lParam
);
HookProc是应用程序定义的名字。
nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。
wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。
注:lParam占4个字节,32位。每一位都是一个特殊的标志。比如说如果Alt键被按下的话,第29位就是1,否则为0。那么键盘按下和弹起是哪个呢?是第30位。这一位标记了上次按键的状态。在消息发送之前,如果按键是按下的,那么值为1,否则为0。第31位标记当前按键的状态,取值和第30位的规则相同。
为了避免钩子函数触发两个,可以在HookProc判断是31位的状态,避免钩子函数的二次执行。
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) { if(lParam >> 31) { //do something } }