我正在向我的应用程序发送消息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?)在Don的回答中,发送到应用程序句柄的消息被重定向到主窗体,但在我的情况下它不会发生。 我怎样才能收到邮件? 为什么邮件不会重定向到主表单?
在Delphi XE8,Windows 10下进行测试
答案 0 :(得分: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;
答案 1 :(得分:-3)
我找到了接收消息的解决方案: 我将主窗体的标题设置为等于Application.Title。所以现在FindWindow返回Main表单的句柄。 但现在我不能使用主要形式的动态字幕。