在c#中模拟数字符号(#)击键

本文关键字:击键 符号 数字 模拟 | 更新日期: 2023-09-27 18:01:55

我正在尝试使用user32.dll中的SendInput准确地键入哈希符号(数字符号,井号,章鱼号,无论你叫它什么)。

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

  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来模拟正在键入的数字/哈希符号,并使其成为全局的,不依赖于非美国键盘的敲击次数最少?

谢谢

在c#中模拟数字符号(#)击键

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

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

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

或者,您可以使用VkKeyScanEx函数自己进行翻译,以获得字符的虚拟键码,然后使用MapVirtualKeyEx将该虚拟键码映射到扫描码。不过,我不能肯定地说这是否有效,因为我从未尝试过这种方法。