zoukankan      html  css  js  c++  java
  • 虚拟键盘的输入和钩子的一点学习

    当A程序在后台运行,B程序是当前的焦点时。如何触发A程序的按钮,向B程序写数据?

    一个很简单的方法就是用钩子

    这个在msdn上面也是有的,需要的时候可以到上面去查看。

    g_hKeyBoard = SetWindowsHookEx( WH_KEYBOARD_LL
    ,KeyBoardProc, GetModuleHandle(NULL), 0 );

    这里我是勾取键盘的消息。

    LRESULT CALLBACK CAutoUHFDemoDlg::KeyBoardProc( int nCode, WPARAM wParam, LPARAM lParam )
    {
        if (nCode >= 0)
        {
            PKBDLLHOOKSTRUCT pmll = (PKBDLLHOOKSTRUCT) lParam;
            if (pmll->vkCode == 131)
            {
                static int iCount = 0;
                ++iCount;
                if (iCount == 2)
                {
                    pDemoDlg->OnInvOnceBtnClick();
                    iCount = 0;
                }
                return 0;
            }
        }
        return CallNextHookEx(g_hKeyBoard, nCode, wParam, lParam);
    }
    View Code

    这里是我的回调函数,钩子勾取的是键盘的KeyDown 和 KeyUp 所以在进行处理的时候,我用了iCount进行计数,否则会出现一个按键调用两次的情景。

    在析构的时候必须要记得:UnhookWindowsHookEx(g_hKeyBoard);

    接下来要记录的是关于虚拟键盘的发送问题,因为虚拟键盘发送的消息只是当前焦点所在位置。

    又因为咱们键盘没有大写字母,所以在进行写大写字母的时候要添加shift键进行发送

    BYTE bKey = 'X';
    keybd_event(VK_SHIFT, 0, KEYEVENTF_SILENT, 0);
    keybd_event(bKey, 0, KEYEVENTF_SILENT, 0);
    keybd_event(bKey, 0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0);
    keybd_event(VK_SHIFT, 0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0);

    在这里如果没有添加shift键,即使我这里bKey是大写的X,发送过去的还是小写的x。

    这里还有一个问题是第三个参数的KEYEVENTF_SILENT问题,这个我也不懂为什么,只是如果不加这个的话,bKey是X,然而发送过去的却不是这个字母(求懂的人给点解释)

    咱们键盘都要有keydown和keyup,所以在虚拟键盘发送一个字符的时候需要成对的使用。在没有定义KEYEVENTF_KEYUP时就默认有keydown了。

  • 相关阅读:
    MacOS Sierra允许运行任何来源的程序
    Windows Server2008 R2中的角色
    Linux根目录解析
    Linux安装配置SVN服务器
    Linux6.x修改出eth0网卡的解决方法
    如何利用mount命令挂载另一台服务器上的目录
    Arcgis水文分析-Dem提取集水区
    前端布局之Flex布局
    其实我就是想好好的写写代码(一个伪程序猿的独白)
    WebApi关于配置全局返回Json数据格式时间以及命名小写
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3361999.html
Copyright © 2011-2022 走看看