c#程序之間進行通訊
【介面】
namespace 程序通訊
[dllimport
("user32.dll")]
public
static
extern
intsendmessage
(int hwnd,
int msg,
int wparam,
refcopydatastruct lparam);[
dllimport
("user32.dll")]
public
static
extern
intfindwindow
(string lpclassname,
string lpwindowname)
;public
form1()
//傳送訊息
public
bool
sendmessageto
(string windowname,
string data)
else
return
false;}
//接收訊息
protected
override
void
defwndproc
(ref
message m)
}private
void
send_click
(object sender,
eventargs e)
}}【分析】
windows訊息系統由3部分組成:
1.訊息佇列。windows應用程式的訊息是由windows統一在乙個訊息佇列中管理的。
2.訊息迴圈。應用程式從windows訊息佇列中獲得自己的訊息,並將其分配給窗體函式進行處理。
3.視窗過程。負責處理接收到的訊息,每個視窗都有對應的視窗過程,負責截獲訊息並響應。wndproc是視窗過程函式,負責處理接收到的訊息,在我們寫**時,不會注意到有這個函式,這是因為開發環境自動為我們生成了。wndproc函式通過switch…case…判斷並處理訊息,對於在case中沒有遇到的情況,會呼叫defwndproc函式進行處理,所以,在c#中使用者自定義訊息,可以過載defwndproc函式使用switch…case…判斷並處理。
c#中的事件就是對windows訊息的封裝,視窗過程中定義了窗體的事件,一定程度就是為了讓程式設計師避免過多的考慮訊息等底層的東西,所以能避免訊息機制解決的問題最好能避免。
wm_copydata 訊息
該訊息只能由 sendmessage() 傳送 ,sendmessage()需要知道程序控制代碼,所以一般都搭配findwindow()使用。通過findwindow查詢程序控制代碼,然後使用sendmessage() 向這個控制代碼傳送資訊
sendmessage函式
該函式將指定的訊息傳送到乙個或多個視窗。此函式為指定的視窗呼叫視窗程式,直到視窗程式處理完訊息再返回。而和函式postmessage不同,postmessage是將乙個訊息寄送到乙個執行緒的訊息佇列後就立即返回。
lresult sendmessage(hwnd hwnd,uint msg,wparam wparam,lparam iparam)
引數hwnd:指定要接收訊息的視窗的控制代碼。如果此引數為hwnd_broadcast,則訊息將被傳送到系統中所有頂層視窗,包括無效或不可見的非自身擁有的視窗、被覆蓋的視窗和彈出式視窗,但訊息不被傳送到子視窗。
msg:指定被傳送的訊息。
wparam:指定附加的訊息特定資訊。
iparam:指定附加的訊息特定資訊。
返回值:返回值指定訊息處理的結果,依賴於所傳送的訊息。
程序之間通訊
之所以開啟子程序 肯定需要他幫我們完成任務,很多情況下,需要將資料返回給父程序。然而程序記憶體是物理隔離的 1.將共享資料放在檔案中,就是慢 2.管道subprocess 中那個管道只能單向通訊,必須有父子關係 3.共享一塊記憶體區域 得作業系統幫你分配,速度快 from multiprocessi...
WPF程序之間通訊
準備 使用copydata,wm user只能用於應用程式內部的通訊,跨程序用copydata public const int wm copydata 0x004a 查詢目標傳送窗體 dllimport user32.dll entrypoint findwindow public static ...
程序之間 執行緒之間的通訊方式
1 程序間的8中通訊方式 1 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 2 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方...