一、主要場景
a)主程序啟動另外一個程序,並傳遞參數
b)主進程向一個已經運行中的程序傳遞參數
二、代碼
1)調用程序:
var HWND: DWORD; ApplicationHWND:DWORD; begin HWND:=FindWindow('TFrmMain', '參數接收窗口'); ApplicationHWND:=GetWindow(HWND,GW_OWNER); if HWND <> 0 then begin memo1.Lines.Add('參數接收程序已運行,向參數接收窗口投遞消息。。。'); SendMessage(HWND,WM_TEST,0,0); SetForegroundWindow(HWND); SetActiveWindow(HWND); ShowWindow(ApplicationHWND, SW_RESTORE); // ShowWindow(HWND, SW_SHOWNORMAL); --此種方式會造成被調用的窗口無法最小化。。。 end else begin memo1.Lines.Add('參數接收程序未運行,啟動程序的同時傳遞參數。。。'); ShellExecute(Handle, 'Open', '..\ParamReceiver\ParamReceiver.exe', '參數1 參數2', nil, SW_SHOWNORMAL); end; end;
2) 接收程序:
獲取被啟動時傳遞過來的參數
var receivedParam_0,receivedParam_1,receivedParam_2:string; begin receivedParam_0:=ParamStr(0); receivedParam_1:=ParamStr(1); receivedParam_2:=ParamStr(2); Memo1.Lines.Add('程序被啟動的同時收到參數。。。'); Memo1.Lines.Add('ParamStr(0)='+receivedParam_0); Memo1.Lines.Add('ParamStr(1)='+receivedParam_1); Memo1.Lines.Add('ParamStr(2)='+receivedParam_2); end;
獲取運行過程中傳遞過來的參數(消息響應)
begin Memo1.Lines.Add('窗口接收到定向投遞過來的參數。。。'); Memo1.Lines.Add('具體的參數可通過內存映射文件實現進程間共享!!'); //Application.Restore; end;
三、運行結果
a)主程序啟動另外一個程序,並傳遞參數
調用程序:
接收程序:
b)主進程向一個已經運行中的程序傳遞參數
調用程序:
接收程序:
PS: 1)一個進程調用另一個程序的主窗體: ShowWindow(Application.handle,SW_RESTORE)
2)一個進程調用另一個程序的子窗體: a)發送消息給被調用程序
b)被調用程序收到消息后,使用form.show顯示子窗體
注:1)防止出現ShowWindow函數調用之后出現:被調用窗口無法最小化的問題,
不可直接使用ShowWindow(Form.handle,---).
2)在Delphi中API函數ShowWindow對delphi的form不太管用,一般都需要發送Application來恢復。
3)使用內存映射文件進程間傳遞參數參見:
http://www.cnblogs.com/edisonfeng/archive/2012/05/21/2511975.html