2015-08-26 182 views
-2

我發送WM_COPYDATA消息給我的應用程序,它有很多表單,但我無法收到它。 簡單的應用程序與一種形式工作正常。如何接收消息(WM_COPYDATA)?

我在主窗體中有此代碼。沒有收到消息

private 
procedure ReceiveMessage(var Msg: TWMCopyData); message WM_COPYDATA; 
... 
procedure TForm1.ReceiveMessage; 
begin 
    ShowMessage(PAnsiChar(Msg.CopyDataStruct.lpData)); 
end; 

我檢查了應用程序和主窗體句柄。因此,處理的模樣:

Form1.Handle (main form) = 3348672 
FindWindow result = Application.Handle = 7148290 
FindWindowEx(Application.Handle,0,nil,nil) = 0 

我在這裏(Delphi: What is Application.Handle?)在唐的答案念過被送往應用處理的消息被重定向到的主要形式,但在我的情況它沒有發生。 如何接收消息? 爲什麼消息不會重定向到主表單?

測試Delphi下XE8時,Windows 10

+3

*「..發送到應用程序句柄的消息被重定向到主窗體..」* - 沒有。 –

+0

*我如何接收消息?*:通過編寫該消息的消息處理程序。 *爲什麼消息不被重定向到主表單?*:我們怎麼知道?你沒有顯示消息的發送方式(或來自哪裏)。請爲發送消息的小應用程序提供一個MCVE,以及旨在接收不這樣的消息的小應用程序。 –

+0

唐的回答說消息被轉發到主窗體「視情況而定」。這只是主窗體和應用程序窗口假裝爲單個窗口所必需的一小部分消息。 wm_CopyData消息不在其中。您可以檢查* Forms.pas *以確認Don的斷言。 –

回答

1

除了您沒有提供任何您需要幫助的實際代碼這一事實,您的問題可能是錯誤的。如果我假設正確,你可以發送消息,你可以接收它,但你把它發送到錯誤的地方。

如果你的表單有動態標題,你可以找到像這樣的句柄。設置標題「MyWindowTitle」的一些固定部分,並使用此功能找到它。

function FindFormHandle: HWND; 
var 
    NextHandle: HWND; 
    NextTitle: array[0..260] of char; 
begin 
    Result:=0; 
    NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST); 

    while NextHandle > 0 do 
    begin 
    GetWindowText(NextHandle, NextTitle, 255); 

    if Pos('MyWindowTitle', NextTitle)>0 then 
     Exit(NextHandle); 

    NextHandle := GetWindow(NextHandle, GW_HWNDNEXT); 
    end; 
end; 
-3

我找到了解決接收消息: 我設置主窗體的標題等於Application.Title。所以現在FindWindow返回Main窗體的句柄。 但現在我不能使用主窗體的動態標題。

+1

所以你的問題出現在我們看不到的代碼中?這與用空應用程序測試時有什麼不同?我的猜測是,應用程序中的其他內容會「吞噬」您嘗試接收的消息。 –

+0

就像你自己記下的那樣(*但現在... *)這是一個保證稍後休息的黑客。以正確的方式解決問題,請參閱其他答案。 –