是否有内置的方法来获取与Shift键组合在一起的等效键,例如:
a + Shift-> A
1 + Shift->!
目前,我将所有键映射到字典中的方式与上面说明的大致相同。
我正在使用Windows窗体。
最佳答案
您可以通过首先调用vkKeyScan来获取所需字符的虚拟键码,从而实现所需的功能。
有了该呼叫的结果,您可以输入ToUnicode
来翻译按Shift键时的字符。
上面提到的两种方法都是KeyBoard and Mouse input类别中的本地WinAPI调用。
结合以上调用并在C#中实现,您将获得以下实现(在LinqPad中测试):
void Main()
{
GetCharWithShiftPressed('1').Dump("1");
GetCharWithShiftPressed('a').Dump("a");
}
// Inspired on https://stackoverflow.com/a/6949520
// TimWi: https://stackoverflow.com/users/33225/timwi
public static string GetCharWithShiftPressed(char ch)
{
// get the keyscancode
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms646329(v=vs.85).aspx
var key = Native.VkKeyScan(ch);
// Use toUnicode to get the actual string shift is pressed
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms646320(v=vs.85).aspx
var buf = new StringBuilder(256);
var keyboardState = new byte[256];
keyboardState[(int) Keys.ShiftKey] = 0xff;
var result = Native.ToUnicode(key, 0, keyboardState, buf, 256, 0);
if (result == 0) return "No key";
if (result == -1) return "Dead key";
return buf.ToString();
}
// Define other methods and classes here
static class Native
{
[DllImport("user32.dll")]
public static extern uint VkKeyScan(char ch);
[DllImport("user32.dll")]
public static extern int ToUnicode(uint virtualKeyCode,
uint scanCode,
byte[] keyboardState,
[Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)]
StringBuilder receivingBuffer,
int bufferSize,
uint flags);
}
运行以上代码,您将获得以下输出:
1个
!
一种
一种
此实现使用当前的活动键盘布局。如果要指定其他键盘布局,请使用将键盘布局的句柄用作其最后一个参数的
ToUnicodeEx
。ToUnicode
处理是从用户this answer的Timwi借来并改编的关于c# - 在Windows中获取键的“Shift”表示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45017557/