2009-07-16 68 views
2

在我的窗體的聲明,我做了一個了MessageHandler:如何添加兩條消息到delphi的消息處理程序?

procedure MessageHandler(var Msg:TMessage);Message MSG_ACCESS; 

const 
MSG_ASYNC = $BAD; 
MSG_ACCESS = $BEEF; 

在消息處理程序,當我檢查的消息,它工作正常,但如果我改變這樣的聲明:

procedure MessageHandler(var Msg:TMessage);Message MSG_ACCESS or MSG_ASYNC; 

我發送的信息都沒有處理。

我該如何處理兩條消息?

+4

您的選擇的消息常量是非常危險的,因爲系統消息有一定範圍,而其他消息則是用戶消息。如果你選擇一個十六進制符號的可愛單詞,恰好是重要的Windows系統消息之一,你可能會完全破壞你的應用程序。您只應使用指定用戶範圍內的消息(WM_USER + n),或註冊自定義窗口消息。 – mghie 2009-07-17 04:08:39

回答

10

只需創建兩個消息處理程序即可調用共享消息處理程序。

Procedure MessageHandler(var Msg:tMessage); 
begin 
    // your code here 
end; 

Procedure MsgAccessHandler(var Msg:Tmessage); message MSG_ACCESS; 
begin 
    MessageHandler(Msg); 
end; 

Procedure MsgAsyncHandler(Var Msg:tMessage); message MSG_ASYNC; 
begin 
    MessageHandler(Msg); 
end; 
+0

解決了這個問題。 :) – 2009-07-16 22:16:19

2

Pascal中的OR運算符根據上下文同時充當邏輯和二進制OR(||和|)。所以MSG_ACCESS或MSG_ASYNC是$ 0BAD或$ BEEF = $ BFEF(0x0BAD | 0xBEEF)。

所以,你正試圖處理消息$ BFEF

另一種方法是使用MessageHook例行

功能MSGHOOK(VAR消息:TMessage):布爾;

形式

創建使用

Application.HookMainWindow(MsgHook); 

確保你解開它的析構函數

Application.UnhookMainWindow(MsgHook); 

function TFormMain.MsgHook(var Message: TMessage): Boolean; 
begin 
    case Message.Msg of 
    MSG_ACCESS : 
    begin 
     // what ever 
    end; 
    MSG_ASYNC: 
    begin 
     // what ever 
    end; 
    end; 
    Result := False; 
end; 

也可以覆蓋的WndProc的形式:

procedure WndProc(var Message: TMessage); override;