博客日历
2025年06月 | ||||||
一 | 二 | 三 | 四 | 五 | 六 | 七 |
26 | 27 | 28 | 29 | 30 | 31 | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
存档
2025年03月 2024年
03月 04月 05月 2021年
01月 02月 11月 12月 2020年
02月 03月 04月 05月 06月 07月
09月 2018年
09月 2017年
01月 02月 07月 2016年
01月 04月 07月 08月 11月 12月
2015年
01月 02月 03月 05月 09月 10月
11月 2014年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2013年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2012年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2011年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2010年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2009年
03月 04月 05月 06月 07月 08月
09月 10月 11月 12月
键盘钩子
1. 创建钩子
HHOOK hHookKeyBoard=SetWindowsHookEx(WH_KEYBOARD,
KeyboardProc,
NULL,
GetCurrentThreadId());
ASSERT(hHookKeyBoard!=NULL);
2. 卸载钩子
if (hHookKeyBoard!=NULL)
{
UnhookWindowsHookEx(hHookKeyBoard);
}
3. 钩子处理过程
LRESULT CALLBACK KeyboardProc(
int code,
WPARAM wParam,//virtual-key code
LPARAM lParam)//keystroke-message information
{
//此时wParam和lParam中包含了击键信息
if (HC_ACTION==code)
{
//如果要屏蔽程序继续处理某些按键,则返回TRUE,例如屏蔽ESC
if (wParam == VK_ESCAPE)
{
return TRUE;
}
//This flag is always set to 0 for WM_KEYDOWN and WM_SYSKEYDOWN messages;
//it is always set to 1 for WM_KEYUP and WM_SYSKEYUP messages.
if ( lParam & 0x80000000== 0 ) //lParam & 0x80000000
{
//WM_KEYDOWN或者WM_SYSKEYDOWN
//Specifies the context code.
//The value is 1 if the ALT key is down; otherwise, it is 0.
if ( lParam & 0x20000000 == 0) //lParam & 0x20000000
{
//Alt is down
}
if ( (GetKeyState(VK_MENU) & 0x8000) == 0x8000) // & 0x8000
{
//Alt is down
}
if ( (GetKeyState(VK_CONTROL) & 0x8000) == 0x8000) // & 0x8000
{
//Ctrl is down
}
}
else
{
// WM_KEYUP或者WM_SYSKEYUP
}
}
return CallNextHookEx(hHookKeyBoard,code,wParam,lParam);
}
ActiveX控件放在容器中后,一旦控件得到了焦点,会使容器窗体收不到键盘消息,可以通过钩子用如下方法解决:
AfxGetMainWnd()->PostMessage(WM_SYSKEYDOWN/*或者*/WM_KEYDOWN,wParam,lParam);
上一篇: 将默认浏览器设置为自己的浏览器需要的全部注册表项
下一篇: 在脚本中创建窗体
分类:Win32/C++ 查看次数:6798 发布时间:2009/8/20 16:01:08