为什么没有"#34;保护覆盖无效WndProc(参考消息m)"工作

时间:2017-11-22 02:35:51

标签: c# winforms wndproc registerhotkey

我现在已经试图解决这个问题很长一段时间了;我已经多次搜索了这篇文章并阅读了更多关于此的文章和问题,而不是我记得的,而且我似乎无法弄清楚究竟出了什么问题。这是一个小程序,我一直试图编译以测试生成应用程序使用的热键。

我试图弄清楚的测试来源如下:

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;

namespace Prg
{
    class MainClass
    {
        [DllImport("User32.dll")]
        private static extern int RegisterHotKey(IntPtr hWnd, int id, int 
        fsModifiers, int vk);
        [DllImport("User32.dll")]
        private static extern int UnregisterHotKey(IntPtr hWnd, int id);

        public static Form f1 = new Form();

        public static int Register(Form f)
        {
            IntPtr ip = f.Handle;
            return RegisterHotKey(ip, 1, 0, (int)Keys.Escape);
        }

        public static void b1_click(object sender, EventArgs e)
        {
            //Blah Blah stuff
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x0312)
            {
                MessageBox.Show("wow");
            }
            base.WndProc(ref m);
        }
        public static void Main()
        {
            Button b1 = new Button();
            b1.Location = new Point(10, 10);
            b1.Text = "wow";
            b1.Click += new EventHandler(b1_click);
            f1.Width = 200;
            f1.Height = 200;
            f1.Controls.Add(b1);
            f1.ShowDialog();
            Register(f1);
        }
    }
}

我一直使用C#4.0编译csc.exe。每次我尝试编译这个或类似的代码时,我都会遇到这个错误:

Main.csx(37,27):错误CS0115: ' Prg.MainClass.WndProc(System.Windows.Forms.Message)':找不到合适的方法来覆盖

使用User32.dll注册热键的每个示例都有"受保护的覆盖WndProc"在它里面的方法,每个人都说它对他们来说效果很好,但我无法弄清楚为什么它不会为我的生活而工作。如果有人可以帮我解决这个问题,我将不胜感激。我使用的是Windows 7 Professional 64位,csc.exe的路径是C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ csc.exe

谢谢:)

修改

我现在已经开始编译了,但现在的问题是它似乎没有注册和热键,或者至少根本没有拿起KeyPress。我的代码中有错误吗?

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;

namespace Prg
{
    class MainClass : Form
    {
        [DllImport("User32.dll")]
        private static extern int RegisterHotKey(IntPtr hWnd, int id, int 
        fsModifiers, int vk);
        [DllImport("User32.dll")]
        private static extern int UnregisterHotKey(IntPtr hWnd, int id);

        public static Form f1 = new Form();

        public static int Register(Form f)
        {
            IntPtr ip = f.Handle;
            return RegisterHotKey(ip, 1, 0, (int)Keys.Escape);
        }

        public static void b1_click(object sender, EventArgs e)
        {
            //Blah Blah stuff
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x0312)
            {
                MessageBox.Show("wow");
            }
            base.WndProc(ref m);
        }
        public static void Main()
        {
            Button b1 = new Button();
            b1.Location = new Point(10, 10);
            b1.Text = "wow";
            b1.Click += new EventHandler(b1_click);
            f1.Width = 200;
            f1.Height = 200;
            f1.Controls.Add(b1);
            f1.ShowDialog();
            Register(f1);
        }
    }
}

我尝试了几种不同的解决方案,但没有一种解决方案让热键完全正常工作。我甚至尝试重写源代码以使用Application.Run(new MainClass());但即使表格集中,它仍然没有检测到Keypress。

修改

问题解决了,因为zzxyz帮助它进行编译,而Antoine帮我修复了代码中的错误。多谢你们。这是编译和工作的代码,适用于任何可能遇到过相同问题或者只是喜欢通过示例学习的人。再次感谢。

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;

namespace Prg
{
    class MainClass : Form
    {
        [DllImport("User32.dll")]
        private static extern int RegisterHotKey(IntPtr hWnd, int id, int 
        fsModifiers, int vk);
        [DllImport("User32.dll")]
        private static extern int UnregisterHotKey(IntPtr hWnd, int id);

        public static MainClass f1 = new MainClass();

        public static int Register(Form f)
        {
            IntPtr ip = f.Handle;
            return RegisterHotKey(ip, 1, 0, (int)Keys.Escape);
        }

        public static void b1_click(object sender, EventArgs e)
        {
            //Blah Blah stuff
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x0312)
            {
                MessageBox.Show("wow");
            }
            base.WndProc(ref m);
        }
        public static void Main()
        {
            Button b1 = new Button();
            b1.Location = new Point(10, 10);
            b1.Text = "wow";
            b1.Click += new EventHandler(b1_click);
            f1.Width = 200;
            f1.Height = 200;
            f1.Controls.Add(b1);
            Register(f1);
            f1.ShowDialog();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

2个错误:

  • 您必须在显示f1之前注册热键。交换最后两行

  • 目前,您为MainClass重写WndProc,而不是为每个表单重写。所以你的表单f1继承了基本的Form.WndProc,而不是你的覆盖。所以只需将f1声明为MainClass,它就可以工作。