【发布时间】:2014-06-22 12:10:45
【问题描述】:
我正在尝试在 user32.dll 中使用 SendInput 准确地键入井号(数字符号、井号、八角符号,随便你怎么称呼它)。
这些是我看到的可能选项:
通过模拟 SHIFT+3(SHFT_DN、3_DN、3_UP、SHFT_UP)键入数字符号。我唯一担心的是美国布局的键盘。配置了非美国布局的系统是否有可能输出错误的键?
我的另一个选择是通过模拟按键按 ascii 码插入字符:ALT+035(ALT_DN、NUMPAD0_DN、NUMPAD0_UP、NUMPAD3_DN、NUMPAD3_UP、NUMPAD5_DN、NUMPAD5_UP、ALT_UP )。这种方法有什么重大缺陷吗?所有区域是否共享相同的 ASCII 代码,Windows 是否在所有区域都提供此 ALT+### 功能?这也将为单个简单字符生成大量击键。我不知道这是否是一个潜在的问题。
理想情况下会有一个虚拟键码,它是一个井号,但我没有看到。我错过了吗?
还有其他我没有想到的可能性吗?出于几个原因,我真的需要继续使用SendInput。
所以我的问题是,我如何使用SendInput 来模拟正在输入的数字/哈希符号,并使其成为全球性的,并且不依赖于非美国键盘,并尽可能减少击键次数?
谢谢
【问题讨论】:
-
即使“qwerty”也不意味着“美国布局” - 我的英国布局 qwerty 键盘有一个 Shift-3 的英镑 (£) 符号。
-
是否需要使用
SendInput而不是SendKeys,顺便说一句? -
@JonSkeet 谢谢。我更新了我的问题以更具体地了解美国(不是 QWERTY)布局。关于
SendKeys,我多年前写了这个库,根据我的回忆,我开始使用MS UIAuto,然后SendKeys,然后SendInput。问题是我需要向许多系统发送击键/填充输入字段,其中一些是 Citrix 和 TermServices 客户端。我不记得我当时遇到的确切问题,但我最终使用了 SendInput(我认为是 Citrix)。我觉得我需要一个支持所有 3 个选项的混合动力车,根据客户要求,也许这就是答案...... -
@AdamPlocher 我希望这可以帮助:我认为您的第三个问题可以解决您的所有问题。对于 CSharp,在您的键盘事件(按键或其他)中,您将看到参数 EventArgs e 或KeyPressEventArgs e etc.. 在你的事件代码中处理这个像 var myNeedChar = e.KeyChar('#').. 然后你会得到实际键盘的 ASCII / UTF-8 / UTF-16 - 无论操作系统使用哪种编码 - 代码equivelant..然后用 keychar 做你项目中需要的东西
-
@JonSkeet 作为一个额外的知识:即使是键盘品牌也可以改变其型号类型本身。我有一个旧的 Logitech-TR(土耳其)键盘。Ctrl+3 是一个欧元符号( €), Shift+3 是 Xor 符号 (^) 和同一个品牌现在 Shift+3 仍然是 Xor 但 Ctrl+3 现在是 Sharp (#)
标签: c# winapi keyboard sendinput