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了。

  • 相关阅读:
    转:Nginx 日志文件切割
    nginx日志切割
    nginx日志配置
    Mongodb数据更新命令
    Android开发书籍推荐
    全面解读python web 程序的9种部署方式
    PowerDesinger15设置字体大小
    A* Pathfinding Project (Unity A*寻路插件) 使用教程
    jQuery的DOM操作之捕获和设置
    如何写一个好的方法
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3361999.html
Copyright © 2011-2022 走看看