关键事件:ProcessCmdKey

2024-02-19

我试图在一个小测试 Windows 窗体应用程序上获得一些键盘响应,并且我有一个粗略的解决方案,即覆盖 ProcessCmdKey。然而,我遇到了一些问题,并且发现了不一致的地方。

不同的事件:有没有办法告诉,在争论中ref Message msg, Keys keyData,事件是 KeyDown、KeyUp 还是 KeyPress?

按键:我看过的所有地方都说 KeyPress(即重复的键盘输入)仅发生在字符键上,而箭头键则不会。然而,对于箭头键和字符键来说,事件处理程序被频繁地调用,并且以相同的方式/相同的行为。这是面对 KeyPress 事件还是其他事件?

理想情况下,我希望有一种方法可以在表单级别处理所有键盘事件,而不让它们传递到表单上的控件。然而,所有的文档都让我很困惑,并且错过了关键点,所以我无法完成这个任务。

感谢对这些主题中的任何一个的帮助。谢谢!


在表单中重写 ProcessCmdKey 的目的是明确允许您实现超出按钮和菜单项中内置助记符处理的自定义快捷键处理。

它仅在按键按下事件时被调用,before无论哪个客户端控件具有焦点,具有焦点的控件都会获取 KeyDown 事件。因此不与 KeyUp 关联,也不与 KeyPress 关联。执行快捷功能后,当您识别出该键时,您会从覆盖中返回 true。这可以防止按键被进一步处理,它不会生成任何 KeyDown/Press/Up 事件。

使用该方法的情况非常罕见msg该方法的参数中,msg.Msg 值只能是 WM_KEYDOWN 或 WM_SYSKEYDOWN,后一条消息是在用户按住 Alt 键时生成的。你并不关心这个,因为你总是可以从keyData争论。像这样:

    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。你can当您想要执行一些不寻常的操作(例如检查重复键)时,请解释消息数据。检查 MSDN 文档中的 WM_KEYDOWN 通知。 msg.LParam 值包含一系列有关击键的信息。

请注意,您只会得到virtual该方法中的键。 Keys.F 是英文键盘布局上的 F 键,但不一定与用户布局上相同位置的键具有相同的字母。优先使用功能键以避免文档麻烦。

按键重复是键盘控制器的一项功能,并不限于键入按键。按住箭头和功能键时肯定会重复。在这种情况下您想忽略 KeyPress。但是,如果您为同时也是打字键的键分配快捷键(例如 Keys.F),那么您想要always还要检查修饰键,这样就不会破坏 TextBox 等控件。

最后但并非最不重要的一点是,不要忘记按钮和菜单项控件中对助记符的内置支持。像这样编写他们的 Text 属性&OK无需任何代码即可生成自记录快捷方式。由用户操作,在此示例中,通过键入 Alt+O。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关键事件:ProcessCmdKey 的相关文章

  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • 使用 C# 使用应用程序密码登录 Office 365 SMTP

    在我们的 Office 365 公司帐户中实施两步身份验证之前 我的 C WPF 程序已成功进行身份验证并发送邮件 我使用了 SmtpClient 库 但现在我必须找到另一个解决方案 因为它不再起作用 我找不到任何使用 O365 应用程序密
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 捕获当前正在播放的声音

    是否可以捕获计算机上当前播放的声音 如果能够将其保存为 mp3 就好了 但我认为这样做会存在一些法律问题 所以 wav 也可以 我环顾四周 有人建议使用虚拟音频线之类的东西 在 C 中捕获声音输出 https stackoverflow c
  • 我的 C# .NET 团队是否应该迁移到 Windows Presentation Foundation? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在生产者-消费者情况下使用条件变量

    我正在尝试了解条件变量以及如何在生产者 消费者情况下使用它 我有一个队列 其中一个线程将数字推入队列 而另一个线程从队列中弹出数字 当生产线程放置一些数据时 我想使用条件变量向消费线程发出信号 问题是有时 或大多数时候 它只将最多两个项目推
  • 抽象类和接口之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 接口与基类 https stackoverflow com questions 56867 interface vs base class 我不明白抽象类和接口之间的区别 我什么时候需要使用哪种字体
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • 标准 C 中的 sizeof 与 sizeof()? [复制]

    这个问题在这里已经有答案了 我看到一些直接使用 sizeof 的代码 想知道它是否是标准 C 令我惊讶的是 它运行得很好 这是一个例子 include
  • 如何使用 Clang 查找内存泄漏

    我在我的机器 ubuntu 中安装了 Clang 以便发现我的 C 代码中的内存泄漏 我编写了一个示例代码来检查它的工作情况 如下所示 File hello c for leak detection include
  • 如何从枚举中选择随机值?

    给定 C 中的任意枚举 如何选择随机值 我没有找到这个非常基本的问题 我会在一分钟内发布我的答案作为任何人的参考 但请随意发布你自己的答案 Array values Enum GetValues typeof Bar Random rand
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • C# - 为什么我需要初始化 [Out] 参数

    我有几个从本机 dll 导入的方法 使用以下语法 internal static class DllClass DllImport Example dll EntryPoint ExampleFunction public static e
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 如何使用 g++ 在 c++ 20 中使用模块?

    我读了这个链接https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules并尝试从该网站复制以下示例 我已经知道这个编译器部分支持模块系统 注 我用的是windo
  • 局部静态变量初始化是线程安全的[重复]

    这个问题在这里已经有答案了 假设我有一个包含三个静态函数的类 如下所示 include
  • 当我读取 500MB FileStream 时出现 OutOfMemoryException

    我使用 Filestream 读取大文件 gt 500 MB 但出现 OutOfMemoryException 任何有关它的解决方案 我的代码是 using var fs3 new FileStream filePath2 FileMode
  • 在 C# 中读取/写入命令行程序

    我正在尝试与 C 的命令行程序进行对话 它是一个情绪分析器 它的工作原理如下 CMD gt java jar analyser jar gt Starting analyser 这是我想从我的 C 程序插入内容的地方 例如 I love y

随机推荐