用以下的代码,发现只能是在屏蔽本程序里按键,切换到其它地方,就不行了!应该怎么改?

HHOOK g_hKeyboard=NULL;
void CHOOKDlg::OnOK() 
{
this->SetHook(m_hWnd);
}

LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if(VK_F2==wParam)
{
// SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hKeyboard);
}
return 1;
}

void CHOOKDlg::SetHook(HWND hwnd)


g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("HOOK.exe"),0);

}

同一段代码我将g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle)中的WH_KEYBOARD改成了13,是可以屏蔽所有程序的按键的,按F2时却卸载不了钩子了!改为WH_KEYBOARD_LL时,告诉我WH_KEYBOARD_LL没声明,郁闷!明明有的呀!

慕尼黑8549860
浏览 146回答 2
2回答

犯罪嫌疑人X

是啊,放在动态连接库里就没问题了。其他可选方法:1,使用 RegisterHotkey2,使用API函数GetAsyncKeyState,与 TIMER 结合使用,如下:if(GetAsyncKeyState(VK_F2) < 0)&nbsp;{&nbsp;}

叮当猫咪

全局钩子是必须用DLL导出函数做的!但是线程钩子是可以做在程序里的!当全局钩子触发的时候,系统去DLL里寻找相关的触发函数!而不是在程序内部寻找的!所以假如你把钩子函数写在自己的程序内部,只能在你的程序是活动窗口的时候,消息才被触发的!但是你让程序失去输入焦点,钩子函数就会失效的!我很理解LZ的想法,我当初做全局钩子,也是不想要个DLL库的,觉得那很不美观的!但是Windows就是这样,她规定了的!没办法改的!假如你想捕捉很少的键盘消息,可以用注册热键的方法的!注册函数BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);当你注册个热键的时候,热键一触发,就会给你设定的窗口发送消息的!参数:hWnd是接受热键触发消息的窗口id:是热键的标识符,为了使热键不冲突!fsModifoers是热键控键的组成部分!比如说你想把热键设置成ALT+S,那fsModifoers就是ALT部分,她总共有3个标识符MOD_ALTMOD_SHIFTMOD_WINvk是除了控制键其他的键!假如想截获多个控制键,比如ALT+SHIFT+S fsModifoers就可以写成MOD_ALT|MOD_SHIFT, vk写成s;
打开App,查看更多内容
随时随地看视频慕课网APP