获取 windows 中键的 'Shift' 表示
Get 'Shift' representation of a key in windows
是否有内置的方法来获得与 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
// TimWi: https://whosebug.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
!
a
A
此实现使用当前活动的键盘布局。如果您想要指定替代键盘布局,请使用 ToUnicodeEx
将键盘布局句柄作为其最后一个参数。
ToUnicode
处理是从 this answer from user Timwi
借用和改编的
是否有内置的方法来获得与 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
// TimWi: https://whosebug.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
!a
A
此实现使用当前活动的键盘布局。如果您想要指定替代键盘布局,请使用 ToUnicodeEx
将键盘布局句柄作为其最后一个参数。
ToUnicode
处理是从 this answer from user Timwi