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

标签 c# wndproc windows-messages

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

最佳答案

你应该覆盖 ProcessCmdKey相反

本例摘自from this article

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,如 this article 中所述。

关于c# - WndProc 中未捕获表单 WM_KEYDOWN 和 WM_KEYUP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20408071/

相关文章:

c++ - 什么消息导致按钮发送 WM_COMMAND 消息

c# - 在启动窗口中处理 WM_NCACTIVATE 会阻塞所有其他窗口

c# - .NET Winforms 垂直进度条文本

windows - 如何捕获从此菜单发送的 Windows 消息?

C# 在 #if DEBUG 中使用语句但不运送程序集

c# - Redis Sentinel C# 客户端

c# - Xamarin Android - Task.Run 与 Task.Factory.StartNew 和 Thread.CurrentPrincipal

c# - 右键单击以选择 DataGridView 中的行

c - 使用基于命令的编译器与 Windows 消息交互

c++ - Windows Messaging - 捕获来自另一个 API 的调用