準備:使用copydata,wm_user只能用於應用程式內部的通訊,跨程序用copydata
public const int wm_copydata = 0x004a;
查詢目標傳送窗體:
[dllimport("user32.dll", entrypoint = "findwindow")]
public static extern intptr findwindow(string lpclassname, string lpwindowname);
定義乙個結構體
[structlayout(layoutkind.sequential)]
public struct copydatastruct
傳送訊息方法
[dllimport("user32.dll", entrypoint = "sendmessage")]
private static extern int sendmessage
intptr hwnd, //目標窗體控制代碼
int msg, //wm_copydata
int wparam, //自定義數值
ref copydatastruct lparam //結構體
封裝方法:
///
/// sendmessage to window
///
/// window的title,建議加上guid,不會重複
/// 要傳送的字串
public static void sendmessage(string windowname, string strmsg)
if (strmsg == null) return;
intptr hwnd = findwindow(null, windowname);
if (hwnd != intptr.zero)
copydatastruct cds;
cds.dwdata = intptr.zero;
cds.lpdata = strmsg;
//注意:長度為位元組數
cds.cbdata = system.text.encoding.default.getbytes(strmsg).length + 1;
// ****窗體
int fromwindowhandler = 0;
sendmessage(hwnd, wm_copydata, fromwindowhandler, ref cds);
傳送舉例:
messagehelper.sendmessage("popupnotify_06f777cb-958e-4cfb-ba80-b311c8cf94e1",」mmessage」);
接收:在mainwindow中註冊hook
void mainwindow_loaded(object sender, routedeventargs e)
接收訊息:
intptr wndproc(intptr hwnd, int msg, intptr wparam, intptr lparam, ref bool handled)
return hwnd;
}另外:獲取目標窗體的控制代碼時,可以先獲取目標process,然後process.mainwindowhandle就是目標窗體的控制代碼。但是如果mainwindow的showintaskbar=false,這個辦法就失效了,只能用findwindow。
程序之間通訊
之所以開啟子程序 肯定需要他幫我們完成任務,很多情況下,需要將資料返回給父程序。然而程序記憶體是物理隔離的 1.將共享資料放在檔案中,就是慢 2.管道subprocess 中那個管道只能單向通訊,必須有父子關係 3.共享一塊記憶體區域 得作業系統幫你分配,速度快 from multiprocessi...
程序之間 執行緒之間的通訊方式
1 程序間的8中通訊方式 1 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 2 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方...
程序之間的通訊 訊號通訊
訊號通訊 方式 訊號型別 下面是幾種常見的訊號 sighup 從終端上發出的結束訊號 sigint 來自鍵盤的中斷訊號 ctrl c sigkill 該訊號結束接收訊號的程序,殺死程序 sigterm kill 命令發出的訊號 sigchld 子程序停止或結束時通知父程序 sigstop 來自鍵盤 ...