VC中不用DLL在窗体中加入全局钩子

HHOOKg_hKeyboard=NULL;voidCHOOKDlg::OnOK(){this->SetHook(m_hWnd);}LRESULTCALLBACKKeyb... 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没声明,郁闷!明明有的呀!
展开
 我来答
百度网友f9c1c3366
2008-12-12 · 超过16用户采纳过TA的回答
知道答主
回答量:43
采纳率:0%
帮助的人:0
展开全部
全局钩子是必须用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;
石榴玉露香凝2510
2008-12-11 · TA获得超过134个赞
知道答主
回答量:94
采纳率:0%
帮助的人:100万
展开全部
是啊,放在动态连接库里就没问题了。
其他可选方法:
1,使用 RegisterHotkey
2,使用API函数GetAsyncKeyState,与 TIMER 结合使用,如下:

if(GetAsyncKeyState(VK_F2) < 0)
{

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2008-12-12
展开全部
全局钩子只能是在DLL里,如果允许你放在你的EXE里面的话,你把EXE关闭了,这个钩子岂不就失效了?整个钩子链就会出问题了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
paniclp
2008-12-11 · TA获得超过232个赞
知道小有建树答主
回答量:700
采纳率:0%
帮助的人:433万
展开全部
必须放到动态链接库里面 孙鑫说的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zyq_07_28
2008-12-11 · TA获得超过258个赞
知道小有建树答主
回答量:185
采纳率:0%
帮助的人:0
展开全部
不用dll就只能对当前程序有效, 没别的办法了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式