• 在Wince下使用钩子函数


    钩子

    1:什是钩子
    从字面上理解,钩子就是想钩住些东西,在程序里可以利用钩子提前处理些
    Windows消息。
       
    例子:有一个FormForm里有个TextBox,我们想让用户在TextBox里输入的时候,不管敲键盘的哪个键,TextBox里显示的始终为“A”,这时我们就可以利用钩子监听键盘消息,先往Windows的钩子链表中加入一个自己写的钩子监听键盘消息,只要一按下键盘就会产生一个键盘消息,我们的钩子在这个消息传到TextBox之前先截获它,让TextBox显示一个“A”,之后结束这个消息,这样TextBox得到的总是“A”。
      
    消息截获顺序:既然是截获消息,总要有先有后,钩子是按加入到钩子链表的顺序决定消息截获顺序。就是说最后加入到链表的钩子最先得到消息。
      
    截获范围:钩子分为线程钩子和全局钩子,线程钩子只能截获本线程的消息,全局钩子可以截获整个系统消息。我认为应该尽量使用线程钩子,全局钩子如果使用不当可能会影响到其他程序。

     2:使用钩子
    使用钩子主要使用以下三个函数SetWindowsHookEx:创建钩子
    CallNextHookEx:将消息传给钩子链中的下一个钩子
    UnhookWindowsHookEx:释放钩子
    对于创建钩子的函数SetWindowsHookEx,MSDN给出其原形如下:

    HHOOK SetWindowsHookEx(
      int idHook,        // type of hook to install
      HOOKPROC lpfn,     // address of hook procedure
      HINSTANCE hMod,    // handle to application instance
      DWORD dwThreadId   // identity of thread to install hook for
    );

      但是以上代码是Windows平台下的钩子使用方法,在wince内核下是不支持的。
      但我们可以通过其他的方法来实现钩子的功能。那就是直接获取钩子函数的地址,然后调用方法。
      g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
      SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
      如法炮制,可以获得其他两个函数的地址,有了这三个函数的地址,就可以类似这样使用了:
       g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, hInstance, 0);

  • 相关阅读:
    table-layout:fixed 布局注意事项
    resize 按钮不会被伪元素遮盖
    background-size:100% 100% 时 background-position: % 失效
    利用 background 和 filter 模糊指定区域
    window.location.href = window.location.href 跳转无反应 a 超链接 onclick 点击跳转无反应
    如何在前台脚本通过json传递数据到后台(使用微软自带的ajax)
    .clear 万能清除浮动
    个人博客开通了
    Mysql The user specified as a definer ('test'@'%') does not exist
    MERGE INTO 解决大数据量复杂操作更新慢的问题
  • 原文地址:https://www.cnblogs.com/xyzlmn/p/3168297.html
Copyright © 2020-2023  润新知