2012-01-04 9 views
0

我想重寫我的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; 

我該怎麼去abo解決它?

+3

嗯,這應該會產生另一個異常,「錯誤創建窗口句柄」。您必須在覆蓋中調用基本方法。發佈異常的堆棧跟蹤如果沒有幫助。 – 2012-01-04 17:18:48

+0

@HansPassant你是對的。我還看到了創建窗口句柄的錯誤。 – ThN 2012-01-04 19:38:14

回答

0

正如HansPassant暗示的那樣,我包含了基類wndproc並且它可以工作。

在Delphi-Prism中,我們這樣做。

inherited WndProc(var m);

與base.wndproc(m)相同;

1

您不需要重寫WndProc,因爲遇到問題,您並不是真的想這樣做。所有你需要做的就是創建處理你希望它處理的,並通過其聲明爲這樣的消息處理程序的特定消息的過程:

procedure HandleSysCommand(var Msg: TWMSysCommand) ; message WM_SYSCOMMAND;

「消息WM_SYSCOMMAND」是什麼,是告訴你應用您正在處理的Windows消息,並且可以使用它來捕獲任何標準或自定義消息。要獲得更多,更高級的信息,爲「Delphi處理Windows消息」進行搜索很容易,可以找回需要處理所有消息需求的所有內容。

相關問題