模拟C#中的数字符号(#)击键

时间:2014-05-06 02:53:12

标签: c# winapi keyboard sendinput

我试图在user32.dll中使用SendInput准确输入一个哈希符号(数字符号,英镑符号,octothorpe,无论你怎么称呼它)。

这些是我看到的可能选项:

  1. 通过模拟 SHIFT + 3 (SHFT_DN,3_DN,3_UP,SHFT_UP)键入数字符号。我唯一关心的是美国布局键盘。系统是否有可能配置非美国布局输出错误的密钥?

  2. 我的另一个选择是通过模拟按键按ascii代码插入字符: ALT + 035 (ALT_DN,NUMPAD0_DN,NUMPAD0_UP,NUMPAD3_DN,NUMPAD3_UP,NUMPAD5_DN,NUMPAD5_UP,ALT_UP )。这种方法有什么重大缺陷吗?所有区域是否共享相同的ASCII代码,Windows是否在所有区域中提供此ALT + ###功能?这也会为单个简单字符生成大量击键。我不知道这是否是一个潜在的问题。

  3. 理想情况下,会有一个虚拟密钥代码是一个哈希符号,但我没有看到一个。我错过了吗?

  4. 我没有想到的任何其他可能性?我真的需要继续使用SendInput,原因有几个。

    所以我的问题是,如何使用SendInput来模拟正在键入的数字/井号,并使其成为全局且不依赖于可能具有最少击键次数的非美国键盘?< / p>

    谢谢

1 个答案:

答案 0 :(得分:1)

您应该可以使用带有SendInput标记的KEYEVENTF_UNICODE来执行此操作。这绕过了使用不同扫描代码表示数字符号的关于不同键盘的注释中讨论的问题。它具有普遍认可的Unicode representation

KEYEVENTF_UNICODE标志应在传递给dwFlags函数的KEYBDINPUT结构的SendInput成员中指定。使用此标志时,将wVk成员设置为0并改为使用wScan成员。该结构的The documentation包含更详细的信息。

但它应该很简单。任何设计合理的应用都将获取消息(使用GetMessagePeekMessage),然后调用TranslateMessage,这将导致WM_CHAR消息被发布适当的Unicode字符值。它甚至可以处理您处理遗留的非Unicode应用程序的情况:如果消息发布到ANSI窗口,Unicode值将自动转换为适当的ANSI值。这应该不是问题,我能想到的所有字符集都包含一个数字符号。

或者,您可以使用VkKeyScanEx function自行完成翻译,以获取角色的虚拟键代码,然后使用MapVirtualKeyEx将此虚拟键代码映射到扫描代码。我不能肯定地说这是否会起作用,因为我从未尝试过这种方法。