如何接收消息 (WM_COPYDATA)?
How can I receive message (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
我在 Don 的回答中(Delphi: What is Application.Handle?)读到发送到应用程序句柄的消息被重定向到主窗体,但在我的情况下并没有发生。
我怎样才能收到消息?
为什么消息没有重定向到主窗体?
在 Delphi XE8、Windows 10
下测试
我找到了接收消息的解决方案:
我将主窗体的标题设置为 Application.Title。所以现在 FindWindow returns 主窗体的句柄。
但是现在我不能使用主窗体的动态标题。
除了您没有提供任何需要帮助的真实代码之外,您的问题可能是错误的。如果我猜对了,你可以发消息,你可以收到消息,但是你发错地方了。
如果您的表单有动态标题,您可以像这样找到它的句柄。设置标题的固定部分"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;
我正在向我的应用程序发送消息 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
我在 Don 的回答中(Delphi: What is Application.Handle?)读到发送到应用程序句柄的消息被重定向到主窗体,但在我的情况下并没有发生。 我怎样才能收到消息? 为什么消息没有重定向到主窗体?
在 Delphi XE8、Windows 10
下测试我找到了接收消息的解决方案: 我将主窗体的标题设置为 Application.Title。所以现在 FindWindow returns 主窗体的句柄。 但是现在我不能使用主窗体的动态标题。
除了您没有提供任何需要帮助的真实代码之外,您的问题可能是错误的。如果我猜对了,你可以发消息,你可以收到消息,但是你发错地方了。
如果您的表单有动态标题,您可以像这样找到它的句柄。设置标题的固定部分"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;