阅读:5795回复:29
关于EVC中用过HOOK的问题
想用键盘钩子做个程序,按下一个键直接调用一个应用程序。
然而CE对HOOK做了好多限制,在安装钩子的时候: SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId()); 报错:'WH_KEYBOARD' : undeclared identifier。 别的倒还好解决,但是钩子的类型都不支持的话,那还怎么用呢? 哪位兄弟有做过钩子的程序吗,请指点一下小弟! |
|
|
沙发#
发布于:2007-01-16 17:04
网上下载的一个键盘钩子源程序,可以用。
|
|
|
板凳#
发布于:2007-01-17 11:51
谢谢zhoumc大哥的帮助!
|
|
|
地板#
发布于:2007-01-17 11:51
谢谢zhoumc大哥的帮助!
只是winceKBhook中定义的 WH_KEYBOARD_LL=20 CE中支持吗?我试了多次,怎么都没什么反应。又或许我的按键值没有设对? 我的消息处理函数是这样写的: LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) { if (VK_DOWN== wParam) //按下DOWN键调用某个应用程序 { SHELLEXECUTEINFO shInfo; memset(&shInfo, 0, sizeof(SHELLEXECUTEINFO)); shInfo.cbSize = sizeof(SHELLEXECUTEINFO); shInfo.fMask = SEE_MASK_NOCLOSEPROCESS; shInfo.lpFile = _T("\\KEYSET.exe"); shInfo.lpParameters = NULL; shInfo.lpDirectory = _T("\\Windows"); ShellExecuteEx(&shInfo); } return 1; } 看了一下EVC的帮助,说CE不支持虚拟键码,这不没戏了?郁闷啊!! |
|
|
地下室#
发布于:2007-01-19 16:57
希望哪为大哥给小弟指点一下迷经
|
|
|
5楼#
发布于:2007-01-20 10:19
首先,请确保你的HOOK处理函数是在一个单独的动态库中。
然后,判断虚拟键值是在lParam中,如下代码: if (nCode == HC_ACTION) if (((KBDLLHOOKSTRUCT*)lParam)->vkCode == VK_DOWN ) { ...... } return CallNextHookEx(NULL, nCode, wParam, lParam); |
|
6楼#
发布于:2007-01-22 09:25
谢谢zhoumc 大哥的帮助!
|
|
|
7楼#
发布于:2007-01-22 14:36
zhoumc 大哥,又要来麻烦你了。
按照你的方法,我把消息处理函数放在了一个单独的KEY.dll中 我建了个应用程序,从KEY.dll中获取消息处理函数,又从coredll.dll中获取钩子函数SetWindowsHookEx,然后安装钩子,三个步骤我都用AfxMessageBox()显示出来,都是成功的,但程序运行之后却说:程序执行了一个非法操作,异常0X80000002。这是为何?当然,按键也没有任何反应了。 |
|
|
8楼#
发布于:2007-01-22 15:09
你说的“消息处理函数”,应该就是指“HOOK处理函数”吧,我们使用时没有什么问题。
你先确定是否进入过“HOOK处理函数”? 进入该函数时,有没有先判断一下lParam参数是否为NULL,总之要先确定是在哪一步中出的问题。 |
|
9楼#
发布于:2007-01-22 19:38
zhoumc 大哥:
是的,我说的“消息处理函数”就是“HOOK处理函数”。 你说的确定是否进入过“HOOK处理函数”,应该如何判断? 进入函数时我有判断过lParam, if (!lParam) ,然后再判断是哪个键按下,做相应的操作,但还是没什么反应。 |
|
|
10楼#
发布于:2007-01-23 08:33
可能是钩子没有装好,把你的代码贴出来,大家看看!
|
|
11楼#
发布于:2007-01-23 09:47
好的!
这是我在DLL中添加的HOOK处理函数,DLL就取名dongku,放在dongku.cpp的最后 //钩子函数 LRESULT CALLBACK KeyboardProcEx(int nCode,WPARAM wParam,LPARAM lParam) { if (nCode == HC_ACTION) { if (!lParam) if (((KBDLLHOOKSTRUCT*)lParam)->vkCode == VK_DOWN ) { SHELLEXECUTEINFO shInfo; memset(&shInfo, 0, sizeof(SHELLEXECUTEINFO)); shInfo.cbSize = sizeof(SHELLEXECUTEINFO); shInfo.fMask = SEE_MASK_NOCLOSEPROCESS; shInfo.lpFile = _T("\\KEYSET.exe"); shInfo.lpParameters = NULL; shInfo.lpDirectory = _T("\\Windows"); ShellExecuteEx(&shInfo); } } return 1; } 在对话框程序的DLG.cpp中的OnInitDialog()函数中,对DLL调用,并安装钩子 //获取HOOK处理函数 g_hHookApiDLL = LoadLibrary(_T("dongku.dll")); if (g_hHookApiDLL ==NULL) { AfxMessageBox(_T("dongku.dll调用失败")); } else { AfxMessageBox(_T("dongku.dll调用成功")); KeyboardProc =(HOOKPROC) GetProcAddress(g_hHookApiDLL, _T("KeyboardProcEx")); } //获取钩子安装程序 g_hcoreDLL = LoadLibrary(_T("coredll.dll")); if(g_hcoreDLL == NULL) { //something is awfully wrong //the dll has to be present AfxMessageBox(_T("coredll.dll调用失败")); } else { //AfxMessageBox(_T("coredll.dll调用成功")); SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hcoreDLL, _T("SetWindowsHookExW")); if(SetWindowsHookEx == NULL) { //this means that MS has really stopped supporting this API in WinCE AfxMessageBox(_T("setwindowshookex调用失败")); } else AfxMessageBox(_T("setwindowshookex调用成功")); } //安装钩子 g_hInstalledLLKBDhook=SetWindowsHookEx(WH_KEYBOARD_LL , KeyboardProc, g_hHookApiDLL, 0); if (g_hInstalledLLKBDhook == NULL ) { AfxMessageBox(_T("钩子安装失败")); } else AfxMessageBox(_T("钩子安装成功")); |
|
|
12楼#
发布于:2007-01-23 18:35
1 KeyboardProc =(HOOKPROC) GetProcAddress(g_hHookApiDLL, _T("KeyboardProcEx"));
加一个对KeyboardProc指针的判断,是否非空 2 将g_hInstalledLLKBDhook=SetWindowsHookEx(WH_KEYBOARD_LL , KeyboardProc, g_hHookApiDLL, 0); 改为 g_hInstalledLLKBDhook=SetWindowsHookEx(WH_KEYBOARD_LL , KeyboardProc, 0, 0); 3 查一下WH_KEYBOARD_LL的定义是否为20 |
|
13楼#
发布于:2007-01-24 09:13
恩。
WH_KEYBOARD_LL定义是20。网上有篇文章说到过CE只支持3种钩子 WH_JOURNALRECORD 0 WH_JOURNALPLAYBACK 1 我试了一下将WH_KEYBOARD_LL定义成13或2,钩子安装都失败。 加了一个对KeyboardProc指针的判断,为非空,KeyboardProcEx调用成功 改成g_hInstalledLLKBDhook=SetWindowsHookEx(WH_KEYBOARD_LL , KeyboardProc, 0, 0); 但程序执行后还是显示说非法操作。会不会和硬件有关系,又或许我的键盘映射有错误? |
|
|
14楼#
发布于:2007-01-24 10:43
你能通过调试的方法,定位"程序执行后还是显示说非法操作"的具体执行语句吗?
|
|
15楼#
发布于:2007-01-24 11:01
我是个新手,不会定位它的错误语句。
|
|
|
16楼#
发布于:2007-01-24 11:49
会用emulator吗?会的话,将同样的代码生成一个for emulator的工程,然后在emulator中调试一下。
|
|
17楼#
发布于:2007-01-24 13:41
恩。好的!我试试。
|
|
|
18楼#
发布于:2007-01-26 13:56
zhoumc 大哥:
小弟愚钝,用emulator无法下载程序到平台上去,装了目标系统的SDK,也不能把程序下载到目标开发板上去,可能是我的PB或EVC装的有问题了。我全新安装再试试。 关于程序执行弹出说非法操作的问题,后来我发现,是我的DLL中未对HOOK处理函数声明为输出函数,在头文件中声明一下__declspec(dllimport)就好了,汗.... 但是按键之后还是没有什么变化,可能是我键盘的映射还有问题。再研究研究。 谢谢您多日来对我的帮助,谢谢! |
|
|
19楼#
发布于:2007-01-27 15:19
试了一下用keybd_event发送键盘消息,终于可以实现其初步的调用的功能了。
我整理了一下,发上来与大家分享一下。 本想把整个工程都发上来的,但试了几下,都出错,不知是否太大了,所以就把几个主要的文件发了上来 再次谢谢zhoumc大哥给我的帮助 |
|
|
上一页
下一页