2

我正在尝试SendInput在 user32.dll 中使用准确地键入一个井号(数字符号、井号、八叉戟,无论你怎么称呼它)。

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

  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. 理想情况下,会有一个是哈希符号的虚拟键码,但我没有看到。我错过了吗?

还有其他我没有想到的可能性吗?我真的需要继续使用SendInput有几个原因。

所以我的问题是,我如何使用SendInput模拟输入的数字/哈希符号,并使其成为全球性的并且不依赖于非美国键盘,并尽可能减少击键次数?

谢谢

4

1 回答 1

2

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

KEYEVENTF_UNICODE标志应在传递给函数dwFlags的结构成员中指定。当您使用此标志时,您将成员设置为 0 并改为使用该成员。该结构的文档包含更详细的信息。KEYBDINPUTSendInputwVkwScan

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

或者,您可以使用VkKeyScanEx函数自己进行翻译,以获取字符的虚拟键码,然后将此虚拟键码映射到使用MapVirtualKeyEx. 不过,我不能确定这是否可行,因为我从未尝试过这种方法。

于 2014-05-06T08:41:48.007 回答