阅读:5952回复:29
关于EVC中用过HOOK的问题
想用键盘钩子做个程序,按下一个键直接调用一个应用程序。
然而CE对HOOK做了好多限制,在安装钩子的时候: SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId()); 报错:'WH_KEYBOARD' : undeclared identifier。 别的倒还好解决,但是钩子的类型都不支持的话,那还怎么用呢? 哪位兄弟有做过钩子的程序吗,请指点一下小弟! |
|
|
沙发#
发布于:2007-09-18 09:33
顶,参考下
|
|
板凳#
发布于:2007-04-29 09:48
多谢wince_lover兄!
|
|
|
地板#
发布于:2007-04-28 13:52
我是自己写的SHELL,是基于对话框的程序,我把RegisterHotKey,加在OnInitDialog中的,可以用RegisterHotKey(this->GetSafeHwnd(),VOLUME_DEC_ID,MOD_CONTROL,VK_DOWN);注册。VOLUME_INC_ID你可以自己定义的(0xC000 -0XFFFF)。然后实现自己的消息函数
LRESULT CShellDlg::OnHotKey(WPARAM wParam,LPARAM lParam) { switch(wParam) { case VOLUME_DEC_ID: SetSystemVol; break; } return 0; } 如果你用的是系统的标准SHELL可以参照上面的方法加上,或者自己创建一个应用程序,加上响应热键,让他自动运行,然后隐藏起来,应该也可以吧,你可以试试 |
|
地下室#
发布于:2007-04-26 22:18
谢谢wince_lover兄弟的回复!
但很惭愧,对于SHELL不基本不了解。能否讲的再详细些,RegisterHotKey应该在哪个文件里添加?消息处理函数又该放在哪里,如何跟具体应用像给合呢?比如说,我按下 ctrl+down系统音量就会降低。 ![]() |
|
|
5楼#
发布于:2007-04-26 13:46
我是加到SHELL里的,在SHELL里注册几个系统热键(在初始化时调用RegisterHotKey(this->GetSafeHwnd(),VOLUME_INC_ID,0,HMI_VK_VOLUME_INC);),只要按了这几个键,SHELL会产生WM_HOTKEY消息,你在消息函数里处理就可以了。
|
|
6楼#
发布于:2007-04-26 11:36
请教wince_lover兄弟:
RegisterHotKey注册系统热键如何做呢。我是想在系统中直接就做好,像PC机上,按下ctl+alt+delete就弹出任务管理器,但是没有头绪。比如RegisterHotKey使用啦,应该在系统哪个地方修改之类的,可以给点意见吗。谢谢! |
|
|
7楼#
发布于:2007-04-23 17:37
其实不需要这么麻烦的,用RegisterHotKey注册系统热键,就可以实现类似的功能了
|
|
8楼#
发布于:2007-04-12 12:12
请问一下zhoumc 大哥,键盘钩子Source.cpp里面的函数ActivateHook怎么调用啊?谢谢了。急啊。
|
|
9楼#
发布于:2007-04-12 11:57
各位大哥,为什么我执行KeyboardProcEx =(HOOKPROC) GetProcAddress(g_hHookApiDLL, _T("LLKeyboardHookCallbackFunction"));后,keybordprocEx值仍然为空呢?急用。
|
|
10楼#
发布于:2007-01-28 10:57
都是受苦受难的兄弟,大家互相帮助吧!
|
|
11楼#
发布于:2007-01-27 15:19
试了一下用keybd_event发送键盘消息,终于可以实现其初步的调用的功能了。
我整理了一下,发上来与大家分享一下。 ![]() 本想把整个工程都发上来的,但试了几下,都出错,不知是否太大了,所以就把几个主要的文件发了上来 再次谢谢zhoumc大哥给我的帮助 |
|
|
12楼#
发布于:2007-01-26 13:56
zhoumc 大哥:
小弟愚钝,用emulator无法下载程序到平台上去,装了目标系统的SDK,也不能把程序下载到目标开发板上去,可能是我的PB或EVC装的有问题了。我全新安装再试试。 关于程序执行弹出说非法操作的问题,后来我发现,是我的DLL中未对HOOK处理函数声明为输出函数,在头文件中声明一下__declspec(dllimport)就好了,汗.... 但是按键之后还是没有什么变化,可能是我键盘的映射还有问题。再研究研究。 谢谢您多日来对我的帮助,谢谢! |
|
|
13楼#
发布于:2007-01-24 13:41
恩。好的!我试试。
|
|
|
14楼#
发布于:2007-01-24 11:49
会用emulator吗?会的话,将同样的代码生成一个for emulator的工程,然后在emulator中调试一下。
|
|
15楼#
发布于:2007-01-24 11:01
![]() |
|
|
16楼#
发布于:2007-01-24 10:43
你能通过调试的方法,定位"程序执行后还是显示说非法操作"的具体执行语句吗?
|
|
17楼#
发布于: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); 但程序执行后还是显示说非法操作。会不会和硬件有关系,又或许我的键盘映射有错误? |
|
|
18楼#
发布于: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 |
|
19楼#
发布于: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("钩子安装成功")); |
|
|
上一页
下一页