我试图为我的winform覆盖“wndProc”方法。所以,我可以为特定的消息实现我自己的wndproc方法。我能成功地做到这一点。但是,现在我遇到了另一个我从未见过的问题。
成功编译之后,我运行程序并弹出以下错误消息:“在单个线程上启动第二个消息循环不是有效操作。请改用Form.ShowDialog。”
我在受保护的访问说明符下的重写方法winproc:
method WndProc(var m:Message); override;
我对winproc方法的定义如下:
method MainForm.WndProc(var m: Message);
const WM_NCLBUTTONDOWN = 161;
const WM_SYSCOMMAND = 274;
const HTCAPTION = 2;
const SC_MOVE = 61456;
begin
if ((m.Msg = WM_SYSCOMMAND) and (m.WParam.ToInt32 = SC_MOVE)) then
begin
exit;
end;
if ((m.Msg = WM_NCLBUTTONDOWN) and (m.WParam.ToInt32 = HTCAPTION)) then
begin
exit;
end;
end;
引发错误的是program.pas文件:
[STAThread]
class method Program.Main(args: array of string);
begin
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += OnThreadException;
using lMainForm := new MainForm do
Application.Run(lMainForm); < --------Raised here.
end;
我该如何解决它?
答案 0 :(得分:1)
您不需要覆盖WndProc,并且您真的不想这样做,因为您遇到了问题。您需要做的就是创建一个处理您希望它处理的特定消息的过程,并将其声明为一个消息处理程序,如下所示:
procedure HandleSysCommand(var Msg: TWMSysCommand) ; message WM_SYSCOMMAND;
“消息WM_SYSCOMMAND”告诉您的应用程序您正在处理哪些Windows消息,并且您可以使用它来捕获任何标准或自定义消息。对于更多,更高级的信息,可以很容易地搜索“Delphi处理Windows消息”,以获取处理所有消息传递需求所需的一切。
答案 1 :(得分:0)
正如HansPassant所暗示的,我包含了基类wndproc,它可以工作。
在Delphi-Prism中,我们这样做。
继承WndProc(var m);
与base.wndproc(m)相同;