- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图在一个小测试 Windows 窗体应用程序上获得一些键盘响应,我有一个粗略的解决方案,即覆盖 ProcessCmdKey。但是,我遇到了几个问题,并且发现了不一致之处。
不同的事件:有没有办法在参数 ref Message msg, Keys keyData
中判断 even 是 KeyDown、KeyUp 还是 KeyPress ?
KeyPress: 我看过的所有地方都说 KeyPress,即重复的键盘输入,只发生在字符键上,而箭头键则不会。但是,对于箭头键和字符键,事件处理程序被频繁地调用,并且以相同的方式/具有相同的行为。这是面对 KeyPress 事件,还是其他什么?
理想情况下,我希望有一种方法可以在表单级别处理所有键盘事件,而不让它们传递给表单上的控件。然而,所有的文档足以让我感到困惑,并且遗漏了关键点,以致于我未能完成此任务。
感谢您就这些主题中的任何一个提供帮助。谢谢!
最佳答案
在您的表单中覆盖 ProcessCmdKey 明确旨在允许您在按钮和菜单项中的内置助记符处理之外实现自定义快捷键击键处理。
它只在按键按下事件上被调用,在具有焦点的控件获得 KeyDown 事件之前,而不管哪个客户端控件具有焦点。所以不与 KeyUp 关联,也不与 KeyPress 关联。在执行快捷功能后,当您识别出该键时,您会从覆盖中返回 true。这可以防止键被进一步处理,它不会生成任何 KeyDown/Press/Up 事件。
很少使用该方法的 msg 参数,msg.Msg 值只会是 WM_KEYDOWN 或 WM_SYSKEYDOWN,当用户按住 Alt 键时会产生后一条消息。你不关心哪个,因为你总是可以从 keyData 参数中得到 if 。像这样:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Alt | Keys.F)) {
// Alt+F pressed
doSomething();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
您可能希望使用 | 检查其他修饰符此处使用的运算符是 Keys.Shift 和 Keys.Control。因此 (Keys.Shift | Keys.Control | Keys.F1) 检查 Ctrl+Shift+F1。当您想做一些不寻常的事情时,例如检查重复键,您可以解释 msg 数据。检查 MSDN 文档以获取 WM_KEYDOWN 通知。 msg.LParam 值包含一堆关于击键的信息。
请注意,在此方法中您只能获得虚拟 键。 Keys.F 是英文键盘布局上的 F 键,但不一定是用户布局上相同位置的键的相同字母。优先使用功能键以避免文档问题。
按键重复是键盘 Controller 的一项功能,并不局限于键入按键。箭头键和功能键在按住时肯定会重复。在这种情况下,您想忽略 KeyPress。但是,如果您为同时也是输入键(如 Keys.F)的键分配快捷键,那么您希望始终同时检查修改键,这样您就不会破坏像 TextBox 这样的控件。
最后但同样重要的是,不要忘记按钮和菜单项控件中对助记符的内置支持。像 &OK
这样编写它们的 Text 属性会生成一个 self 记录的快捷方式,而无需任何代码。由用户操作,在此示例中,通过键入 Alt+O。
关于c# - 关键事件 : ProcessCmdKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10468200/
我正在使用下面提到的代码来捕获按下的键。我之前在其他解决方案中使用过它并且在那里工作正常。但是现在显示错误 Inconsistent accessibility: parameter type 're
我试图在一个小测试 Windows 窗体应用程序上获得一些键盘响应,我有一个粗略的解决方案,即覆盖 ProcessCmdKey。但是,我遇到了几个问题,并且发现了不一致之处。 不同的事件:有没有办法在
只要按住箭头键,我就需要执行某种方法。现在,对于 Visual Studio 2012 中的常规箭头键按下,使用 OnKeyDown不起作用,所以我需要使用 ProcessCmdKey ,这就像一个魅
我的代码: using System.Windows.Forms class Class1 { protected override bool ProcessCmdKey (ref
我有覆盖 TextBox ProcessCmdKey 方法的代码: protected override bool ProcessCmdKey(ref Message msg, Keys keyDat
我在 WinForms 应用程序中遇到以下问题。我正在尝试实现热键,我需要在控件处于事件状态时处理键消息,无论焦点是否位于该控件内的文本框等。 覆盖 ProcessCmdKey 对此非常有效,并且完全
识别击键是否为可打印字符(应出现在文本框中的字符)的最简单方法是什么?我想将 F1、Home 等键与实际出现在文本框中的键分开。我试图通过自己识别所有不可打印的字符来避免大量的 IF 语句。 由于控件
我是 WPF 新手,在 WinForms 中向我经常使用的表单添加热键 ProcessCmdKey这使得重写(添加)关键相关功能变得容易(类似于here描述的方式)。有没有一种简单的方法可以在 WPF
识别击键是否为可打印字符(应出现在文本框中的字符)的最简单方法是什么?我想将 F1、Home 等键与实际出现在文本框中的键分开。我试图通过自己识别所有不可打印的字符来避免大量的 IF 语句。 由于控件
我有一个简单的 Windows 窗体 应用程序,它只不过是一个包含 WebBrowser 的 Form。 我正在覆盖 ProcessCmdKey方法,效果很好。但是,虽然 WebBrowser 获得了
我的目标是实现自定义 Control + S 按键处理程序以连接到 winforms 应用程序中的自定义保存方法。 根据我的研发,有几种方法可以实现这一点。首先,我尝试了明显的 KeyPress 事件
所以我不得不覆盖 ProcessCmdKey 以检测我的 winform 中的制表符按下。参见 this上下文问题。现在我已经成功解决了我遇到的制表问题,我现在意识到我还需要检查 shift+tab
我有一个 WinForms 窗体,它曾经是一个独立的应用程序,但现在正在作为更大的 WPF 应用程序的一部分启动。它仍然是一个单独的窗口,不包含在 WPF 窗口中。我看到的问题是窗口中的 Proces
我是一名优秀的程序员,十分优秀!