C# 查找有关当前键盘布局的字符的可能键组合

C# 查找有关当前键盘布局的字符的可能键组合,c#,c++,keyboard,C#,C++,Keyboard,如何找到与当前键盘布局相关的可能的字符组合 比如, 假设我的键盘的大写锁定已关闭 所以在这种情况下,字符“A”的组合键应该是Shift+A 那很容易。键盘上的非ascii字符或不可见字符,如“@”字符或“\”如何 所以,假设应用程序验证该组合以确定我是机器人还是人类,那么我如何知道应该向应用程序发送哪个组合键以使其处理“{”键呢 提前感谢在Windows中,您可以使用VkKeyScan(char ch)函数。它返回一个短值,其中包含低位字节上的虚拟键代码和高位字节上的修饰符键标志 您可以通过声明

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

比如,

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

那很容易。键盘上的非ascii字符或不可见字符,如“@”字符或“\”如何

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


提前感谢

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

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

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
static extern short VkKeyScan(char ch);
以下是指向文档的链接:


< /p> C++标准库没有用于原始键盘处理的功能。我想你也不会找到任何可移植的库。所以你本质上是用OS API来粘贴的。我认为它可以覆盖我的需求。除了当前的虚拟键代码。如果我想在API上发送“y*”字符,将返回我的ALT+CTRL,但是不是Key.D3。那么我怎么才能提取Key.D3呢?你可以屏蔽返回值:

int virtualKeyCode=returnValue&0xFF
来获取密钥。太好了。这很有效。如果caps lock打开,它会说'Shift'+65代表'A'。你知道吗?你必须自己检查CapsLock密钥的状态。幸运的是你可以使用
GetKeyState(int nVirtKey)
函数获取它。
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
static extern short VkKeyScan(char ch);