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;