c 自定義訊息 程序間通訊

2021-12-29 22:31:30 字數 2524 閱讀 3082

using system; 

using system.collections.generic; 

using system.linq; 

using system.text; 

using system.runtime.interopservices; 

using system.diagnostics; 

namespace topinfo.metevation.common 

//wm_copydata訊息所要求的資料結構 

public struct copydatastruct 

public intptr dwdata; 

public int cbdata; 

[marshalas(unmanagedtype.lpstr)] 

public string lpdata; 

/// 本類封裝了一些程序間通訊的細節 

public class winmessageutil 

public const int wm_copydata = 0x004a; 

//通過視窗的標題來查詢視窗的控制代碼 

[dllimport("user32.dll", entrypoint = "findwindow")] 

private static extern int findwindow(string lpclassname, string lpwindowname); 

//在dll庫中的傳送訊息函式 

[dllimport("user32.dll", entrypoint = "sendmessage")] 

private static extern int sendmessage 

int hwnd,                        // 目標視窗的控制代碼   

int msg,                        // 在這裡是wm_copydata 

int wparam,                    // 第乙個訊息引數 

ref  copydatastruct lparam        // 第二個訊息引數 

/// 傳送訊息,只能傳遞乙個自定義的訊息id和訊息字串,想傳乙個結構,但沒成功 

/// 目標程序名稱,如果有多個,則給每個都傳送 

/// 自定義資料,可以通過這個來決定如何解析下面的strmsg 

/// 傳遞的訊息,是乙個字串 

public static void sendmessage(int towndhandler, string strmsg) 

string s = towndhandler.tostring(); 

if (strmsg == null) return; 

int towindowhandler = findwindow(null, "置頂自動觀測站服務");//獲取目標視窗控制代碼

方法一 

//獲取目標視窗控制代碼方法二 

//process foundprocess = process.getprocessesbyname

("topinfo.metevation.controller.services.exe"); 

//foreach (process p in foundprocess) 

//    towndhandler = p.mainwindowhandle.toint32(); 

// systemeventlog.log.writeentry(s + "獲得控制代碼aaa" + towndhandler); 

copydatastruct cds; 

cds.dwdata = (intptr)100;   //這裡可以傳入一些自定義的資料,但只能是4位元組整數   

cds.lpdata = strmsg;            //訊息字串 

cds.cbdata = system.text.encoding.default.getbytes(strmsg).length + 1;  //注意,

這裡的長度是按位元組來算的 

//傳送方的視窗的控制代碼, 由於本系統中的接收方不關心是該訊息是從哪個視窗發出的,所以

就直接填0了 

int fromwindowhandler = 0; 

sendmessage(towndhandler, wm_copydata, fromwindowhandler, ref  cds); 

/// 接收訊息,得到訊息字串 

/// system.windows.forms.message m 

/// 接收到的訊息字串 

public static string receivemessage(ref  system.windows.forms.message m) 

copydatastruct cds = (copydatastruct)m.getlparam(typeof(copydatastruct)); 

return cds.lpdata; 

程序間通訊 自定義訊息

自定義訊息wm copydata,使用sendmessage傳送訊息 最近想實現程序間通訊,遇到一些問題記錄一下。傳送方 dllimport user32.dll entrypoint sendmessage private static extern int sendmessage int hwn...

各種自定義訊息通訊

一 普通的自定義訊息方法。大家都很清楚使用者自定義訊息的範圍,不過,雖然說用會自定義訊息從wm user開始,但是由於我們的工程裡面一般還有很多其他的控制項,他們也要占用一部分wm user訊息範圍,所以我們必須為他們留出一部分範圍,這裡,我們保留100個訊息,一般情況下,這可以滿足我們的要求。1 ...

C 程序間通訊 訊息佇列

訊息佇列是訊息的鏈結表,包括posix訊息佇列system v訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。訊息佇列a include include include ...