如何在 WPF 中捕获 Ctrl + Tab 和 Ctrl + Shift + Tab?
Posted
技术标签:
【中文标题】如何在 WPF 中捕获 Ctrl + Tab 和 Ctrl + Shift + Tab?【英文标题】:How to capture Ctrl + Tab and Ctrl + Shift + Tab in WPF? 【发布时间】:2010-10-23 05:44:52 【问题描述】:哪些示例代码会捕获 Ctrl+Tab 和 Ctrl+Shift+Tab?
我们已经创建了KeyDown
事件,还尝试使用输入手势添加命令绑定,但我们始终无法捕获这两个快捷方式。
【问题讨论】:
【参考方案1】:你有什么 KeyDown 处理程序?下面的代码对我有用。给我带来麻烦的是:Alt + Tab,但你没有要求:D
public Window1()
InitializeComponent();
AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent);
private void HandleKeyDownEvent(object sender, KeyEventArgs e)
if (e.Key == Key.Tab && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift))
MessageBox.Show("CTRL + SHIFT + TAB trapped");
if (e.Key == Key.Tab && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
MessageBox.Show("CTRL + TAB trapped");
【讨论】:
@siz 您可以使用以下语法清理您的 If 语句:Keyboard.Modifiers.HasFlag(ModifierKeys.Control)
有 xamly 的方法吗?
如何处理 Alt+Tab ?
这么多的赞成票,它似乎工作,但这是错误的。如果您注释掉第一个“if”块,第二个仍将捕获 Ctrl+Shift+Tab。 MessageBox 使控件失去焦点。如果您将两个“if”块都保留为未注释并将 MessageBox 替换为 Console.WriteLine 用于 Ctrl+Shift+Tab,您也会看到“CTRL + TAB 被困”。在比较之前,您无法重置 Keyboard.Modifiers 上的标志。您必须比较确切的值。
(Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift)
也捕获了 Ctrl+Shift+Alt,所以对我来说使用(Keyboard.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift))
似乎更好【参考方案2】:
Gustavo 的答案正是我想要的。我们想要验证输入键,但仍然允许粘贴:
protected override void OnPreviewKeyDown(KeyEventArgs e)
if ((e.Key == Key.V || e.Key == Key.X || e.Key == Key.C) && Keyboard.IsKeyDown(Key.LeftCtrl))
return;
【讨论】:
遗憾的是,当用户使用正确的 ctrl 按钮时,这将无法处理 :-)【参考方案3】:您必须使用 KeyUp
事件,而不是 KeyDown
...
【讨论】:
有趣。没试过,能解释一下原因吗? 确定。当您尝试同时捕获 2 个或更多击键时,您不能使用 KeyDown 检查 e.Key,因为它一次捕获一个键。如果需要 KeyDown,例如当用户按住组合键时执行某些操作,您应该使用 KeyDown 和 Keyboard 类,特别是 IsKeyDown(),测试特定键。 对不起,我不明白你在这里想说什么。 KeyUp 事件也只在 e.Key 中传递一个 Key 值。您能否举一个具体的例子,说明处理 KeyUp 而不是 KeyDown 对于“同时捕获 2 个或更多击键”会更好?谢谢。 @RayBurns 捕获 KeyUp 背后的想法是,在 KeyUp 的那一刻,所有“修饰符”键都已被按下。您只需要检查它们以找出同一处理程序中的整个组合键。如果您改用 KeyDown,则很难从 Shift+Ctrl+A 告诉 Shift+Ctrl(例如更改键盘布局)。 Up 和 Down 事件都是有原因的。一切都取决于用例。在某些情况下,使用 Down 会更好,例如。只要按下它,您就想重复绑定到它们的键的动作,而无需反复敲击它们的键。如果您想防止动作触发多次错误(错误地按下键太久),您更喜欢使用 Up。【参考方案4】:Szymon Rozga 答案的工作版本(抱歉,我无法发表评论)。我们不看Alt,但是一开始可以简单地添加它的会计if
public View()
InitializeComponent();
AddHandler(Keyboard.PreviewKeyDownEvent, (KeyEventHandler)controlKeyDownEvent);
private void controlKeyDownEvent(object sender, KeyEventArgs e)
if (e.Key == Key.Tab && Keyboard.Modifiers.HasFlag(ModifierKeys.Control))
if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift))
MessageBox.Show("CTRL + SHIFT + TAB trapped");
else
MessageBox.Show("CTRL + TAB trapped");
【讨论】:
【参考方案5】:您好,您可以在 keydown 事件中使用它
private void OnButtonKeyDown(object sender, KeyEventArgs e)
if(Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.Tab) && Keyboard.IsKeyDown(Key.LeftShift))
//
// TODO: somthing here
//
【讨论】:
这里的问题还在于,如果我使用 (Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.Tab)) 再添加一个 if 语句。如果我按 Ctrl +Shift + Tab 将执行这两个语句 这种情况下可以设置cancel=true;在两个语句中同时按下 Ctrl+Shift+Tab以上是关于如何在 WPF 中捕获 Ctrl + Tab 和 Ctrl + Shift + Tab?的主要内容,如果未能解决你的问题,请参考以下文章
用于 RibbonTab 的 WPF IsSelected 绑定在 ctrl+tab 上停止工作