在单个线程上启动第二个消息循环不是有效的操作

时间:2012-01-04 16:25:01

标签: .net override message delphi-prism

我试图为我的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;

我该如何解决它?

2 个答案:

答案 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)相同;