如何使用 c# 发送(keybd_event)Unicode 键

Posted

技术标签:

【中文标题】如何使用 c# 发送(keybd_event)Unicode 键【英文标题】:How to send(keybd_event) Unicode Keys with c# 【发布时间】:2015-09-30 23:10:41 【问题描述】:

如何将所有 Unicode 密钥发送到 'keybd_event' 。 . ?

我在下面找到了“Alt + Unicode(十进制代码)”方法和 C++ 代码

但是,我在 c# 中尝试失败。 .

void TypingMessageFromCodePage(TCHAR* Message, UINT CodePage=0)

    TCHAR Word[2];
    TCHAR WordCode[64];
    char MultiByte[64];

    static const BYTE NumCode[10]=0x2D, 0x23, 0x28, 0x22, 0x25, 0x0C, 0x27, 0x24, 0x26, 0x21;
    int Length = wcslen(Message);

    for(int i=0; i<Length; i++)
    
        Word[0] = Message[i];
        Word[1] = L'\0';

        WideCharToMultiByte(CodePage, 0, Word, -1, MultiByte, 64, NULL, NULL);
        _itow((int)(((~MultiByte[0])^0xff)<<8)+((~MultiByte[1])^0xff), WordCode, 10);

        keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);

        for(int j=0; j<wcslen(WordCode); j++)
        
            keybd_event(NumCode[(int)WordCode[j]-48], MapVirtualKey(NumCode[(int)WordCode[j]-48], 0), 0, 0);
            keybd_event(NumCode[(int)WordCode[j]-48], MapVirtualKey(NumCode[(int)WordCode[j]-48], 0), KEYEVENTF_KEYUP, 0);
        
        keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
    

【问题讨论】:

【参考方案1】:

不要使用keybd_event()。请改用SendInput()。为此目的,它有一个KEYEVENTF_UNICODE 标志。您可以使用它发送实际的 UTF-16 代码单元(.NET String 中的每个 char 都被编码为 UTF-16 代码单元)。完全不需要模拟 Alt+xxxx 代码。例如:

https://***.com/a/30630477/65863

https://***.com/a/15442914/65863

https://***.com/a/8885228/65863

【讨论】:

寻找解决方案。 SendInput() 对我不起作用。 那你可能没有正确使用它。它确实有效。 非常感谢雷米。我不能轻易做到。几次阅读您的答案后,我清楚了我必须做什么。非常感谢。 这绝对有效。感谢@RemyLebeau 的链接。这应该被标记为正确答案。

以上是关于如何使用 c# 发送(keybd_event)Unicode 键的主要内容,如果未能解决你的问题,请参考以下文章

keybd_event() 调用未发送到远程桌面

C#中调用user32.dll库的keybd_Event函数,操作键盘

keybd_event模拟键盘发送组合键

C# 模拟Windows键盘消息

如何在 windows xp 中获取主音量?

如何在 Windows 中模拟 SHIFT+END 组合键