WIN下面進程間通信的最常用辦法就是消息了.
下面記錄兩種消息通信的方式:
--------------------------------------------------------------------------------------------
一.第一種辦法,利用注冊Windows全局的消息.並覆蓋wndProc過程來監聽消息處理.
1.
發送消息方:
private
strWM:Cardinal; //定義一個局部變量
...
proccedure Form1.Create(sender:TObject);
begin
strWM:= RegisterWindowMessage('newspopMessage'); //注冊一個windows全局消息,通過這個消息與其它進程通信
end;
...
procedure Form1.Button1Click1(Sender:TObject);
var
h:Cardinal;
begin
//通信的步驟得先找到要通信的信息窗口Handle
h:=findWindow('目標進程窗口類名','窗口Caption');
//發送消息消息類型為自定義的strWM
SendMessage(h,strWM,0,0); //這裡同樣可以帶參數.wParam,lParam.但我傳一個PChar,讀取的時候總報錯.不知道為啥
end;
2.
接收消息方:
private
strWM:Cardinal; //定義一個局部變量
procedure wndProc(var msg:Tmessage);override; //覆蓋這個方法,可以監聽所有的Windows消息回調函數
...
proccedure Form1.Create(sender:TObject);
begin
strWM:= RegisterWindowMessage('newspopMessage'); //注冊一個windows全局消息,這個相當於暗號
end;
procecure form1.wndProc(var msg:TMessage);
begin
//在這裡處理這個消息就行了
showmessage(strpas(PChar(mes.lparam))); //這樣寫會報錯的.但可以處理其它無參數的事情
end;
----------------------------------------------------------------------------------------------
二.第二種辦法,發送一個WM_COPYDATA的消息.並且可以帶一個TCopyDataStruct的結構類型參數.
1.
發送消息方:
procedure TMainForm.CallAgent(msg: string);
var
HlAgent:HWND;
ds:TCopyDatastruct; //定義一個TCopyDatastruct結構體變量
begin
AgentMsg := msg;
ds.cbData := Length(msg)+1; //結構體的第一個元素: 長度cbData
GetMem(ds.lpData,ds.cbData); //分配內存,結構體的第二個參數: 數據的指針lpDATA
StrCopy(ds.lpData,PChar(msg)); //復制值到結構指針
HlAgent :=FindWindow('TmsgpopMainCaller','調用者'); //查找目標窗體的Handle
if HlAgent <> 0 then
begin
//ShowMessage('主' + IntToStr(Cardinal(@ds)));
SendMessage(HlAgent,WM_COPYDATA,0,Cardinal(@ds)); //發送WM_COPYDATA消息,並帶上參數 @ds
end;
FreeMem(ds.lpData); //釋放數據內存
end;
2.
接收方程序:
public
procedure MyMessage(var m:TWmCopyData);message WM_CopyData; //定義一個消息響應過程,並傳入一個TWmCopyData的參數
...
procedure TmsgpopMainCaller.MyMessage(var m: TWmCopyData); //實現響應
var
msg:string;
begin
msg :=StrPas(m.CopyDataStruct^.lpData); //獲取參數數據
ShowMessageForm := TShowMessageForm.Create(self,msg); //處理
end;