如何找到与当前键盘布局相关的字符的可能组合键

例如;

假设我的键盘的大写锁定已关闭所以在这种情况下,字符“A”组合键应该是 Shift + A

那很简单。非 ascii 字符或键盘上不可见的字符(例如“@”字符或“\”)怎么样

for "@" I use Ctrl + Alt + Q
for "\" I use Ctrl + Alt + *
for "{" I use Ctrl + Alt + 7

那么我怎么知道应该向应用程序发送哪个组合键以使其处理“{”键,假设应用程序验证该组合以确定我是机器人还是人类。

提前致谢


在 Windows 中您可以使用VkKeyScan(char ch)函数。它返回一个短值,其中包含低位字节上的虚拟键代码和高位字节上的修饰键标志。

您可以通过声明以下方式在 C# 中调用它:

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
static extern short VkKeyScan(char ch);

这是文档的链接:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms646329%28v=vs.85%29.aspx


C++ 标准库没有原始键盘处理功能。我认为您也找不到任何可移植的库。所以你基本上只能使用操作系统 API。

我认为这可以满足我的要求。当前的虚拟键码除外。因此,如果我想通过 api 发送“#”字符,VkKeyScan 将返回 Alt + Ctrl,但不会返回 Key.D3 。那么我怎样才能提取Key.D3呢?

您可以屏蔽返回值:int virtualKeyCode = returnValue & 0xFF来获取密钥。

伟大的。这样可行。除了如果大写锁定打开时,它会显示“Shift”+ 65 表示“A”。你有什么主意吗 ?

您必须自行检查 CapsLock 键的状态。幸运的是,您可以使用GetKeyState(int nVirtKey)函数来获取它。