WndProc 中未捕获表单 WM_KEYDOWN 和 WM_KEYUP 消息

2023-12-04

不捕获表单 keydown 和 keyup 消息:

public partial class Form1 : Form
{
    const int WM_KEYDOWN = 0x100;
    const int WM_KEYUP = 0x101;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_KEYDOWN)
        {
            log("down");
        }
        if (m.Msg == WM_KEYUP)
        {
            log("up");
        }
        base.WndProc(ref m);
    }
}

你应该覆盖进程命令键 instead

这个例子是摘录出来的从这篇文章

public partial class Form1 : Form, IMessageFilter
{
    const int WM_KEYDOWN = 0x100;
    const int WM_KEYUP = 0x101;
    const int WM_SYSKEYDOWN = 0x104;
    Keys lastKeyPressed = Keys.None;
    public Form1()
    {
        InitializeComponent();
        Application.AddMessageFilter(this);
        this.FormClosed += (s, e) => Application.RemoveMessageFilter(this);
    }
    public bool PreFilterMessage(ref Message m) 
    {
        if(m.Msg == WM_KEYUP)
        {
            Debug.WriteLine("Filter -> KeyUp LastKeyPressed=" + lastKeyPressed.ToString());
        }
        return false;
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
        {
            lastKeyPressed = keyData;
            switch (keyData)
            {
                case Keys.Down:
                    Debug.WriteLine("Down Arrow Captured");
                    break;

                case Keys.Up:
                    Debug.WriteLine("Up Arrow Captured");
                    break;

                case Keys.Tab:
                    Debug.WriteLine("Tab Key Captured");
                    break;

                case Keys.Control | Keys.M:
                    Debug.WriteLine("<CTRL> + M Captured");
                    break;

                case Keys.Alt | Keys.Z:
                    Debug.WriteLine("<ALT> + Z Captured");
                    break;
            }
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
            

可能有一种方法可以从传递给 PreFilterMessage 的消息中提取 KeyCode,如中所述本文

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

WndProc 中未捕获表单 WM_KEYDOWN 和 WM_KEYUP 消息 的相关文章

随机推荐

  • 如何将 Column.isin 与列表一起使用?

    val items List a b c sqlContext sql select c1 from table filter c1 isin items collect foreach println 上面的代码抛出以下异常 Except
  • 表是“只读”的

    当我想执行一个update在我的桌子上查询时出现错误 1036 桌子data是只读的 我该如何解决这个问题 表属性在 var db mysql被设置为777 修复表 功能似乎没有帮助 我能做点什么吗 就我而言 mysql配置文件有innod
  • 如何将子类的向量传递给需要父类向量的函数?

    我可以将 Child 传递给需要 Parent 的成员函数 但是在使用向量时 我收到编译错误 提示没有匹配的声明 请参阅底部的 CorrelationEngineManager cpp 对 getUniqueLabels 的调用 服务器事件
  • MKPinAnnotationView:是否有超过三种颜色可用?

    根据 Apple 文档 MKPinAnnotationView 引脚颜色有红色 绿色和紫色可供选择 还有什么办法可以得到其他颜色吗 我在文档中没有找到任何内容 多一点 和原来的 和代码 MKAnnotationView mapView MK
  • 平均库存历史表

    我有一个表格 用于跟踪某些商店和产品的库存随时间的变化 该值是绝对库存 但我们仅在库存发生变化时插入新行 这种设计是为了保持表较小 因为预计它会快速增长 这是一个示例架构和一些测试数据 CREATE TABLE stocks id seri
  • DbAcl::check() - 权限检查中 ARO/ACO 节点查找失败。

    我正在使用 cakephp 并使用 acl 但我面临这个错误 DbAcl check Failed ARO ACO node lookup in permissions check 感谢帮助 您可能已向控制器添加了操作 但未更新aco桌子
  • CSS 属性中“auto”值的含义是什么?

    是什么意思autoCSS 属性的值 当 CSS 属性的值设置为时会发生什么auto 上述财产的价值已调整自动地根据元素的内容或上下文 例如 一个块级元素height auto随着包含更多文本 它会变得更高 再举一个例子 一个块元素margi
  • 安装后运行 kubectl 命令 Helm

    我想运行一些kubectl用于验证 Helm 图表的集群安装后的命令 我找不到与此相关的任何文档 在 Helm 中 存在将注释显示为一部分的概念NOTES txt但看起来您不能在该阶段运行任何命令 目前 Helm 无法做到这一点吗 您可以定
  • 将 morgan 与 logger 一起使用时,stream.write 不是一个函数

    基本上我正在尝试使用摩根和温斯顿为nodejs实现记录器 当我尝试使用 morgan 时 抛出stream write 错误不是一个函数 因为我想获取文件名 所以我传递模块 从模块对象有一个名为文件名的属性 下面是我的代码 温斯顿 js c
  • 如何将 Vim 中每行开头的空格数量减半?

    有人可以告诉我如何在 Vim 中执行与此映射相反的操作 nnoremap
  • 默认指定的非类型模板参数值时出现“使用类模板需要模板参数”错误

    编译这个 include
  • 调用弹出窗口的“.ShowDialog()”时 WPF 应用程序关闭

    首先 我想解释一下我要做什么 我正在开发一个学习应用程序来向学生展示一些卡片 我有CardPack类是一组卡片 为了获得卡包的许可 我想从用户那里获取 ID 然后我创建了一个窗口来从用户那里获取 RegisterKey 这是我的GetReg
  • 求所有连续子数组最大差值之和(S)的最佳方法

    给定一个包含 n 个元素的数组 d 0 d 1 d n 1 计算所有连续子数组的最大差值的和 S 形式上 S 总和 max d l r 最小值 d l r 0 Input 4 1 3 2 4 Output 12 解释 l 0 r 0 数组
  • python绘制多个直方图

    我有一个包含 30 个变量的数据框 X v1 v2 v30 and col name v1 v2 v30 对于每个变量 我想绘制直方图以了解变量分布 但是 写代码逐一绘制太手动了 我可以用for循环之类的东西一次性绘制30个直方图吗 例如
  • Python 3.1.3 打开 mbox 文件,与 python 2.x 相比真的慢吗?

    我尝试在 python 3 1 3 中使用邮箱模块打开 mbox 文件 里面只有3封邮件 只有27k大 但是 当阅读邮件时 我的 CPU 使用 100 大约 2 3 分钟 直到它完成任务且没有错误 我用 python 2 7 1 尝试了同样
  • 在 Android 上实时更改曲目的播放速率

    我想知道是否有人知道一个可以实时更改曲目播放速率的库 我的想法是加载曲目并将其播放速率更改为一半或两倍 首先 我尝试使用 MusicPlayer 但根本不可能 然后我尝试使用 SoundPool 问题是 使用 SoundPool 一旦加载曲
  • 如何复制包含“\0”字符的数据

    我正在尝试复制包含 0 的数据 我正在使用 C 当研究结果是否定的时 我决定编写自己的函数来将数据从一个 char 复制到另一个 char 但它没有返回想要的结果 我的尝试如下 include
  • Laravel 急切加载与嵌套关系

    我知道有人问过这个问题 但我的情况有所不同 我定义了与评论模型关系的帖子模型 Post Model public function comments return this gt hasMany comment 和评论模型 每个评论属于一个
  • 在Python中查找列表中最长和最短的列表[重复]

    这个问题在这里已经有答案了 我需要打印列表中具有最小和最大项目数的列表 例如 如果我有 total list 1 2 3 1 2 3 4 1 2 3 4 5 我需要返回具有最小和最大长度的列表 我该怎么做 输出可能类似于 total lis
  • WndProc 中未捕获表单 WM_KEYDOWN 和 WM_KEYUP 消息

    不捕获表单 keydown 和 keyup 消息 public partial class Form1 Form const int WM KEYDOWN 0x100 const int WM KEYUP 0x101 protected o