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

 月光下大手拉S小手 发布于 2023-02-12 16:28

未捕获表单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);
    }
}

Steve.. 9

你应该重写ProcessCmdKey代替

此示例摘自本文

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(" + M Captured");
                    break;

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

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

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

1 个回答
  • 你应该重写ProcessCmdKey代替

    此示例摘自本文

    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,如本文所述

    2023-02-12 16:30 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有