gpt4 book ai didi

c# - 获取 'Shift' 键在 Windows 中的表示

转载 作者:行者123 更新时间:2023-11-30 23:11:00 26 4
gpt4 key购买 nike

是否有内置的方法来获得与 Shift 键组合的键的等价物,例如:

a + Shift -> A

1 + Shift -> !

我目前已将所有键映射到字典中,其方式与上面所示的方式几乎相同。

我正在使用 Windows 窗体。

最佳答案

您可以通过先调用 vkKeyScan 来实现您想要的效果获取您感兴趣的字符的虚拟键码。

根据该调用的结果,您可以输入 ToUnicode翻译按下 Shift 键时的字符。

上述两种方法都是 KeyBoard and Mouse input 中的 native 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
!

a
A

此实现使用当前事件的键盘布局。如果您想要指定替代键盘布局,请使用 ToUnicodeEx它将键盘布局的句柄作为其最后一个参数。

ToUnicode 处理是从 this answer 借用和改编的来自用户Timwi

关于c# - 获取 'Shift' 键在 Windows 中的表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45017557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com