【问题标题】:SendInput() Keyboard letters C/C++SendInput() 键盘字母 C/C++
【发布时间】:2010-11-04 12:06:40
【问题描述】:

我正在尝试使用 SendInput() 向另一个应用程序(记事本)发送一个句子,然后按 Enter 键发送它。

任何代码sn-ps?或者帮忙

【问题讨论】:

    标签: c++ c winapi keyboard


    【解决方案1】:
    INPUT input;
    WORD vkey = VK_F12; // see link below
    input.type = INPUT_KEYBOARD;
    input.ki.wScan = MapVirtualKey(vkey, MAPVK_VK_TO_VSC);
    input.ki.time = 0;
    input.ki.dwExtraInfo = 0;
    input.ki.wVk = vkey;
    input.ki.dwFlags = 0; // there is no KEYEVENTF_KEYDOWN
    SendInput(1, &input, sizeof(INPUT));
    
    input.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &input, sizeof(INPUT));
    

    List of virtual key codes .....

    【讨论】:

    • 使用VkKeyScanEx( char, KeyboardLayout )把你的“普通”chars放到这个例子中:) ...input.ki.wVk = VkKeyScanEx('a',kbl);对于KeyboardLayout,最简单的方法是加载当前窗口的keyboardLayout:HKL kbl = GetKeyboardLayout(0);
    • 感谢您和@jave.web 的回答。我在下面的答案中编写了用于输入字符的代码(抱歉,我找不到如何将代码插入评论部分)。
    【解决方案2】:

    我在阅读@Nathan 的代码this reference 并结合@jave.web 的建议后进行了修改。此代码可用于输入字符(大写和小写)。

    #define WINVER 0x0500
    #include<windows.h>
    void pressKeyB(char mK)
    {
        HKL kbl = GetKeyboardLayout(0);
        INPUT ip;
        ip.type = INPUT_KEYBOARD;
        ip.ki.time = 0;
        ip.ki.dwFlags = KEYEVENTF_UNICODE;
        if ((int)mK<65 || (int)mK>90) //for lowercase
        {
            ip.ki.wScan = 0;
            ip.ki.wVk = VkKeyScanEx( mK, kbl );
        }
        else //for uppercase
        {
            ip.ki.wScan = mK;
            ip.ki.wVk = 0;
    
        }
        ip.ki.dwExtraInfo = 0;
        SendInput(1, &ip, sizeof(INPUT));
    }
    

    下面是按回车键的功能:

        void pressEnter()
    {
        INPUT ip;
        ip.type = INPUT_KEYBOARD;
        ip.ki.time = 0;
        ip.ki.dwFlags = KEYEVENTF_UNICODE;
        ip.ki.wScan = VK_RETURN; //VK_RETURN is the code of Return key
        ip.ki.wVk = 0;
    
        ip.ki.dwExtraInfo = 0;
        SendInput(1, &ip, sizeof(INPUT));
    
    }
    

    【讨论】:

    • 请注意,以防其他人感到困惑:pressEnter() 函数适用于文本字段/编辑器,但不会在某些表单控件中触发响应。以下帖子在 VK_RETURN 的两种情况下都能正常工作:stackoverflow.com/a/20857633/8690169
    • 第 9 行读取 if ((int)mK&lt;65 &amp;&amp; (int)mK&gt;90),即转换为 int 的 char 代码必须同时小于 65 和大于 90。我假设这必须是一个,即if ((int)mK&lt;65 || (int)mK&gt;90),以匹配ASCII表中的特殊字符和小字符,否则条件是互斥的,永远无法满足
    • 感谢@BobbieE.Ray 指出这一点。我根据您的建议编辑了帖子。
    • 感谢您更新代码。如果您能给我的评论点赞,我将不胜感激。我正在努力,以便有一天我可以直接编辑答案:) 谢谢
    【解决方案3】:

    SendInput 函数接受一个 INPUT 结构数组。 INPUT 结构可以是鼠标或键盘事件。 keyboard event structure 有一个名为 wVk 的成员,它可以是键盘上的任何键。 Winuser.h 头文件为每个键提供宏定义 (VK_*)。

    【讨论】:

      【解决方案4】:

      这里有一个简单的 C++ 示例http://nibuthomas.wordpress.com/2009/08/04/how-to-use-sendinput/

      还有一个更完整的 VB 示例在这里http://vb.mvps.org/samples/SendInput/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-09
        • 2012-07-11
        • 2012-07-11
        • 2012-05-15
        • 2017-12-14
        • 1970-01-01
        相关资源
        最近更新 更多