为什么 "protected override void WndProc(ref Message m)" 不工作
Why isn't "protected override void WndProc(ref Message m)" working
很长一段时间以来,我一直在努力解决这个问题;我已经搜索了好几次,阅读的文章和问题比我记得的还要多,而且我似乎无法弄清楚到底出了什么问题。这是一个小程序,我一直在尝试编译它来测试生成一个供应用程序使用的热键。
我一直想弄清楚的测试来源如下:
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 注册热键的例子都包含 "protected override 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);
}
}
}
我尝试了几种不同的解决方案,但 none 其中的热键完全可以使用。我什至尝试重写源代码以使用 Application.Run(new MainClass());但即使表单获得焦点,它仍然没有检测到按键。
编辑
感谢 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();
}
}
}
2 个错误:
您必须在显示 f1 之前注册热键。交换最后两行
目前,您重写了 MainClass 的 WndProc,而不是每个窗体。因此,您的表单 f1 继承了基础 Form.WndProc,而不是您覆盖的基础。所以只需将 f1 声明为 MainClass 即可。
很长一段时间以来,我一直在努力解决这个问题;我已经搜索了好几次,阅读的文章和问题比我记得的还要多,而且我似乎无法弄清楚到底出了什么问题。这是一个小程序,我一直在尝试编译它来测试生成一个供应用程序使用的热键。
我一直想弄清楚的测试来源如下:
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 注册热键的例子都包含 "protected override 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);
}
}
}
我尝试了几种不同的解决方案,但 none 其中的热键完全可以使用。我什至尝试重写源代码以使用 Application.Run(new MainClass());但即使表单获得焦点,它仍然没有检测到按键。
编辑
感谢 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();
}
}
}
2 个错误:
您必须在显示 f1 之前注册热键。交换最后两行
目前,您重写了 MainClass 的 WndProc,而不是每个窗体。因此,您的表单 f1 继承了基础 Form.WndProc,而不是您覆盖的基础。所以只需将 f1 声明为 MainClass 即可。