C# 如何检测控件+;不是VirtualKey键盘组合?
我正在设置一个在单个页面上工作的全局键盘快捷键,比如C# 如何检测控件+;不是VirtualKey键盘组合?,c#,uwp,keyboard-shortcuts,keyevent,C#,Uwp,Keyboard Shortcuts,Keyevent,我正在设置一个在单个页面上工作的全局键盘快捷键,比如Ctrl+someKey来做一些事情,Ctrl+Alt+otherKey来激活一些其他事情等等。我对Ctrl+VirtualKey(字母、数字等)有或多或少的工作代码,但我还需要一些不在VirtualKey中的键,如点、逗号、加号、减号等 以下是已注册的事件: public Planner() { this.InitializeComponent(); CoreWindow.GetForCurrentThrea
Ctrl+someKey
来做一些事情,Ctrl+Alt+otherKey
来激活一些其他事情等等。我对Ctrl+VirtualKey
(字母、数字等)有或多或少的工作代码,但我还需要一些不在VirtualKey
中的键,如点、逗号、加号、减号等
以下是已注册的事件:
public Planner()
{
this.InitializeComponent();
CoreWindow.GetForCurrentThread().KeyDown += CoreWindow_KeyDown;
CoreWindow.GetForCurrentThread().CharacterReceived += Planner_CharacterReceived;
Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated;
}
我对Ctrl+K
使用KeyDown
,Ctrl+Shift+A
类似快捷键
CharacterReceived
捕获逗号、点、加号、减号等字符,但它们不能与Ctrl和Alt一起使用
最后,
Dispatcher\u Acceleratoryy
检查是否按下了Alt键。目前,UWP不支持注册全局热键,但您可以在应用程序内部响应windows快捷方式,如下所示
首先,注册用于按钮热键的加速器键事件
public MainPage()
{
this.InitializeComponent();
// Register for accelerator key events used for button hotkeys
Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated;
}
检测Ctrl+V或Ctrl+n
对于三个键,如Ctrl+Shift+V
这些键是故意从VirtualKey枚举中省略的。它们是OEM键,键盘制造商可以把它们放在任何他们喜欢的地方。或者完全忽略它们。世界上某个地方的用户必须先按一个特殊的键才能获得角色,这种情况并不少见。这使得他们在面向全世界的框架中选择快捷键时很糟糕。你仍然可以使用CharacterReceived,你。正如我上面指出的,我使用CharacterReceived来捕获逗号、点、加号、减号键,但与Ctrl或Alt组合使用时,它们不会触发事件。就像任何特殊的键(Ctrl、Alt或shift)都会阻止触发器的发生。也许是因为角色的结果,它不是一个被接受的角色。这就是我到目前为止得到的。我目前正在使用这3个已注册事件,但此时不支持使用Ctrl、Alt或Shift组合的特殊字符。这就是我要问的,如何获得Ctrl+逗号、Ctrl+Alt+Dot等组合。对于三个键,您还可以使用上面的解决方案添加一个相交条件
shift.HasFlag(coreVirtualKeyState.Down)
。
private void Dispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args)
{
if (args.EventType.ToString().Contains("Down"))
{
var ctrl = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
if (ctrl.HasFlag(CoreVirtualKeyStates.Down))
{
switch (args.VirtualKey)
{
case VirtualKey.V:
ViewOrders_Tapped(this, null);
break;
case VirtualKey.N:
NewOrder_Tapped(this, null);
break;
}
}
}
}
private void Dispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args)
{
if (args.EventType.ToString().Contains("Down"))
{
var ctrl = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
var shift = Window.Current.CoreWindow.GetKeyState(VirtualKey.Shift);
if (ctrl.HasFlag(CoreVirtualKeyStates.Down) && shift.HasFlag(CoreVirtualKeyStates.Down))
{
switch (args.VirtualKey)
{
case VirtualKey.V:
break;
case VirtualKey.N:
break;
}
}
}
}