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 ...