saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
阅读:5797回复:29

关于EVC中用过HOOK的问题

楼主#
更多 发布于:2007-01-16 16:50
  想用键盘钩子做个程序,按下一个键直接调用一个应用程序。
然而CE对HOOK做了好多限制,在安装钩子的时候:
SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());

报错:'WH_KEYBOARD' : undeclared identifier。
别的倒还好解决,但是钩子的类型都不支持的话,那还怎么用呢?
哪位兄弟有做过钩子的程序吗,请指点一下小弟!
努力! 成功就在不远处....
zhoumc
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2008-11-25
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望88点
  • 贡献值0点
  • 好评度80点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-01-16 17:04
网上下载的一个键盘钩子源程序,可以用。
附件名称/大小 下载次数 最后更新
键盘钩子Source.zip (3KB)  101 2007-01-16 17:04
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-01-17 11:51
谢谢zhoumc大哥的帮助!
努力! 成功就在不远处....
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
地板#
发布于: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不支持虚拟键码,这不没戏了?郁闷啊!!
努力! 成功就在不远处....
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-01-19 16:57
希望哪为大哥给小弟指点一下迷经
努力! 成功就在不远处....
zhoumc
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2008-11-25
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望88点
  • 贡献值0点
  • 好评度80点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-01-20 10:19
首先,请确保你的HOOK处理函数是在一个单独的动态库中。
然后,判断虚拟键值是在lParam中,如下代码:

if (nCode == HC_ACTION)
     if (((KBDLLHOOKSTRUCT*)lParam)->vkCode == VK_DOWN )
     {
       ......
     }
   return CallNextHookEx(NULL, nCode, wParam, lParam);
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-01-22 09:25
谢谢zhoumc 大哥的帮助!
努力! 成功就在不远处....
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-01-22 14:36
zhoumc 大哥,又要来麻烦你了。
按照你的方法,我把消息处理函数放在了一个单独的KEY.dll中
我建了个应用程序,从KEY.dll中获取消息处理函数,又从coredll.dll中获取钩子函数SetWindowsHookEx,然后安装钩子,三个步骤我都用AfxMessageBox()显示出来,都是成功的,但程序运行之后却说:程序执行了一个非法操作,异常0X80000002。这是为何?当然,按键也没有任何反应了。
努力! 成功就在不远处....
zhoumc
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2008-11-25
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望88点
  • 贡献值0点
  • 好评度80点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-01-22 15:09
你说的“消息处理函数”,应该就是指“HOOK处理函数”吧,我们使用时没有什么问题。
你先确定是否进入过“HOOK处理函数”?
进入该函数时,有没有先判断一下lParam参数是否为NULL,总之要先确定是在哪一步中出的问题。
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-01-22 19:38
zhoumc 大哥:
是的,我说的“消息处理函数”就是“HOOK处理函数”。
你说的确定是否进入过“HOOK处理函数”,应该如何判断?
进入函数时我有判断过lParam, if (!lParam) ,然后再判断是哪个键按下,做相应的操作,但还是没什么反应。
努力! 成功就在不远处....
zhoumc
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2008-11-25
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望88点
  • 贡献值0点
  • 好评度80点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-01-23 08:33
可能是钩子没有装好,把你的代码贴出来,大家看看!
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
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("钩子安装成功"));
努力! 成功就在不远处....
zhoumc
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2008-11-25
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望88点
  • 贡献值0点
  • 好评度80点
  • 原创分0分
  • 专家分0分
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
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
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);

但程序执行后还是显示说非法操作。会不会和硬件有关系,又或许我的键盘映射有错误?
努力! 成功就在不远处....
zhoumc
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2008-11-25
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望88点
  • 贡献值0点
  • 好评度80点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-01-24 10:43
你能通过调试的方法,定位"程序执行后还是显示说非法操作"的具体执行语句吗?
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-01-24 11:01
我是个新手,不会定位它的错误语句。
努力! 成功就在不远处....
zhoumc
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2008-11-25
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望88点
  • 贡献值0点
  • 好评度80点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-01-24 11:49
会用emulator吗?会的话,将同样的代码生成一个for emulator的工程,然后在emulator中调试一下。
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-01-24 13:41
恩。好的!我试试。
努力! 成功就在不远处....
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-01-26 13:56
zhoumc 大哥:
  小弟愚钝,用emulator无法下载程序到平台上去,装了目标系统的SDK,也不能把程序下载到目标开发板上去,可能是我的PB或EVC装的有问题了。我全新安装再试试。
    关于程序执行弹出说非法操作的问题,后来我发现,是我的DLL中未对HOOK处理函数声明为输出函数,在头文件中声明一下__declspec(dllimport)就好了,汗....
      但是按键之后还是没有什么变化,可能是我键盘的映射还有问题。再研究研究。
    谢谢您多日来对我的帮助,谢谢!
努力! 成功就在不远处....
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-01-27 15:19
试了一下用keybd_event发送键盘消息,终于可以实现其初步的调用的功能了。
我整理了一下,发上来与大家分享一下。
本想把整个工程都发上来的,但试了几下,都出错,不知是否太大了,所以就把几个主要的文件发了上来
再次谢谢zhoumc大哥给我的帮助
附件名称/大小 下载次数 最后更新
CE键盘钩子.rar (5KB)  53 2007-01-27 15:19
努力! 成功就在不远处....
上一页
游客

返回顶部