【发布时间】:2014-03-08 09:41:17
【问题描述】:
我正在开发一个应用程序来防止多个实例。我尝试使用 wm_copydata 向第一个应用程序实例发送消息,但它不起作用,但我可以通过 WM_SYSCOMMAND 发送消息
if not checkInstance.RestoreIfRunning(Application.Handle,oldHandle, 1) then
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(Tfrm_main, frm_main);
Application.Run;
end
else
begin
stringToSend := 'My Message';
aCopyData.dwData := 0; //use it to identify the message contents
aCopyData.cbData := 1 + Length(stringToSend) ;
aCopyData.lpData := PChar(stringToSend) ;
SendMessage(oldHandle,WM_COPYDATA,longint(oldHandle),longint(@aCopyData));
end;
....
mainform:
private
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
.
.
.
procedure mainForm.WMCopyData(var Msg: TWMCopyData);
begin
ShowMessage('received!');
end;
【问题讨论】:
-
检查
oldHandle是否包含您的mainForm窗口的有效句柄。此外,您可以(应该)将True返回到接收方的Msg.Result属性,并检查发送方的SendMessage的返回值。此外,SendMessage函数的参数类型是WParam和LParam,而不是像网上一些纯代码sn-ps写的longint。 -
oldhandle 是有效的句柄。另外,我已经为 Msg.Result 设置了返回值,但没有工作。我已经使用了这个参数类型并且它工作了
-
FWIW,你的演员阵容错了。投射到
WPARAM和LPARAM。这样你的代码就可以在 64 位下运行。 -
我已更改 sendMessage 但无法再次工作:
SendMessage(oldHandle, WM_COPYDATA, WPARAM(oldHandle), LPARAM(@aCopyData)) ; -
好吧,所以
oldHandle没有包含您的mainForm窗口的有效句柄,因为我要求您检查。
标签: delphi