为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
慕尼黑8549860 2023-04-23 22:17:09
HHOOK g_hKeyboard=NULL;void CHOOKDlg::OnOK() {this->SetHook(m_hWnd);}LRESULT CALLBACK KeyboardProc(int code, // hook codeWPARAM wParam, // virtual-key codeLPARAM 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没声明,郁闷!明明有的呀!
查看完整描述

2 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

是啊,放在动态连接库里就没问题了。
其他可选方法:
1,使用 RegisterHotkey
2,使用API函数GetAsyncKeyState,与 TIMER 结合使用,如下:

if(GetAsyncKeyState(VK_F2) < 0) 


}

查看完整回答
反对 回复 2023-04-26
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

全局钩子是必须用DLL导出函数做的!
但是线程钩子是可以做在程序里的!
当全局钩子触发的时候,系统去DLL里寻找相关的触发函数!
而不是在程序内部寻找的!所以假如你把钩子函数写在
自己的程序内部,只能在你的程序是活动窗口的时候,消息才
被触发的!但是你让程序失去输入焦点,钩子函数就会失效的!
我很理解LZ的想法,我当初做全局钩子,也是不想要个DLL库的,觉得
那很不美观的!但是Windows就是这样,她规定了的!没办法改的!
假如你想捕捉很少的键盘消息,可以用注册热键的方法的!
注册函数BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);
当你注册个热键的时候,热键一触发,就会给你设定的窗口发送消息的!
参数:
hWnd是接受热键触发消息的窗口
id:是热键的标识符,为了使热键不冲突!

fsModifoers是热键控键的组成部分!比如说你想把热键设置成
ALT+S,那fsModifoers就是ALT部分,她总共有3个标识符
MOD_ALT
MOD_SHIFT
MOD_WIN
vk是除了控制键其他的键!
假如想截获多个控制键,比如ALT+SHIFT+S fsModifoers就可以写成
MOD_ALT|MOD_SHIFT, vk写成s;

查看完整回答
反对 回复 2023-04-26
  • 2 回答
  • 0 关注
  • 219 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信