D hwnd;
hwnd=::GetForegroundWindow();
::PostMessage(hwnd,WM_CLOSE,0,0);
return 0;
}
l 7
程序运行完毕后解除热键
在OnDestroy()中通过UnRegisterHotKey()解除热键登记,释放系统资源.
UnregisterHotKey( m_hWnd, 1001);
l 8 编译并运行
程序 运行程序后,无论何时只要按下热键Esc后本
程序便立关闭当前的窗口。
方法2:利用键盘钩子函获数实现
说到钩子函数,可能对许多初学编程的人很陌生,我这里就多说几句:
WINDOW的消息处理机制为了能在应用
程序中监控系统的各种事件消息,提供了挂接
各种反调函数(HOOK)的功能。这种挂钩函数(HOOK)类似扩充中断驱动
程序,挂钩
可以挂接多个反调函数构成一个挂接函数链。系统产生的各种消息首先被送到各种
挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交还控
制权或将消息传递给下一个挂接函数以致最终达到窗口函数。WINDOW系统的这种反
调函数挂接方法虽然会略加影响到系统的运行效率,但在很多场合下是非常有用
的,通过合理有效地利用键盘事件的挂钩函数监控机制可以达到预想不到的良好效果。
l 1 在WINDOW下可进行挂接的过滤函数包括11种:
WH_CALLWNDPROC 窗口函数的过滤函数
WH_CBT
计算机培训过滤函数
WH_DEBUG 调试过滤函数
WH_GETMESSAGE 获取消息过滤函数
WH_HARDWARE 硬件消息过滤函数
WH_JOURNALPLAYBACK 消息重放过滤函数
WH_JOURNALRECORD 消息记录过滤函数
WH_MOUSE 鼠标过滤函数
WH_MSGFILTER 消息过滤函数
WH_SYSMSGFILTER 系统消息过滤函数
WH_KEYBOARD 键盘过滤函数
WH_KEYBOARD_LL在WindowsNt4.0以上可用的键盘过滤函数
WH_MOUSE_LL 在WindowsNt4.0以上可用的鼠标过滤函数
l 2 其中键盘过滤函数是最常用最有用的过滤函数类型,不管是哪一种类型的过滤函
数,其挂接的基本方法都是相同的。
WINDOW调用挂接的反调函数时总是先调用挂接链首的那个函数,因此必须将键盘挂
钩子函数利用函数SetWindowsHookEx()将其挂接在函数链首。至于消息是否传递给函
数链的下一个函数是由每个具体函数功能确定的,如果消息需要传统给下一个函
数,可调用API函数的CallNextHookEx()来实现,如果不传递直接返回即可。
l 在
程序中可以利用函数SetWindowsHookEx()来挂接过滤函数,在挂接函数时必须指
出该挂接函数的类型、函数的入口地址以及函数是全局性的还是局部性的,挂接函
数的具体调用格式如下:
HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);
其中,第一个参数是钩子的类型;第二个参数是钩子函数的地址;第三个参数是包
含钩子函数的模块句柄;第四个参数指定监视的线程。如果指定确定的线程,即为
线程专用钩子;如果指定为空,即为全局钩子。其中,全局钩子函数必须包含在DLL
(动态
链接库)中,而线程专用钩子还可以包含在可执行文件中。得到控制权的钩子
函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个
SDK中的API函数CallNextHookEx来传递它。钩子函数也可以通过直接返回TRUE来丢
弃该消息,并阻止该消息的传递。
的确如果函数是全局性的,那么它必须放在一个DLL(动态链接库)中,但是我发现在
window 2000以上的版本中,不用写 DLL(动态链接库)就可以作出全局性的键盘函数。用它可以做