c 本地程序之間進行通訊

2021-10-01 08:03:53 字數 2303 閱讀 2973

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 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方...