自定義訊息wm_copydata,使用sendmessage傳送訊息
最近想實現程序間通訊,遇到一些問題記錄一下。
傳送方:
[dllimport("user32.dll", entrypoint = "sendmessage")]
private static extern int sendmessage(int hwnd, int msg, int wparam, ref copydatastruct lparam); //傳送訊息
[dllimport("user32.dll", entrypoint = "findwindow")]
private static extern int findwindow(string lpclassname, string lpwindowname); //獲取窗體的hwnd
[structlayout(layoutkind.sequential)]
public struct copydatastruct //自定義結構
public const int user = 0x500; // 自定義訊息的rang 0x0400-0x7fff
const int wm_user_copydata = user + 1;
copydatastruct cds;
cds.dwdata = (intptr)100;
cds.lpdata = "e:\\wyp\\資源\\lover.mp4";
cds.cbdata = len + 1;
sendmessage(hwnd, wm_user_copydata, 0, ref cds);
(1)本想傳遞乙個字串引數到接收方,定義乙個結構傳遞乙個字串。
接收方:
protected override void defwndproc(ref system.windows.forms.message m)
{switch (m.msg)
{case wm_user_copydata:
copydatastruct mystr = new copydatastruct();
type mytype = mystr.gettype();
mystr =(copydatastruct)m.getlparam(mytype)
string str=mystr.lparam; //這個為空。
(2)用自定義結構接收不到字串,然後我就想用共享記憶體。
然後用到了marshal.copy()方法 發現marshal只能用在乙個程序中。
marshal.copy(m_pwdata, bytdata, 0, infosize); //將資料從非託管記憶體指標複製到託管 8 位無符號整數陣列。
marshal.copy(bytdata, 0, m_pwdatawrite, lngsize); //將一維的託管 8 位無符號整數陣列中的資料複製到非託管記憶體指標。
(3)然後我又想在傳送方程序中申請乙個記憶體空間,目標程序收到傳來的記憶體位址,讀取記憶體,最後釋放記憶體。
傳送發:
[dllimport("kernel32.dll", charset = charset.auto)] //關閉共享記憶體
public static extern bool unmapviewoffile(intptr pvbaseaddress);
[dllimport("kernel32.dll", charset = charset.auto)]
public static extern bool closehandle(intptr handle); // 呼叫closehandle(handle)表示建立者放棄對該核心物件的操作。如果該物件的引用物件記數為0就撤消該物件。
......待寫。。。
c 自定義訊息 程序間通訊
using system using system.collections.generic using system.linq using system.text using system.runtime.interopservices using system.diagnostics namesp...
各種自定義訊息通訊
一 普通的自定義訊息方法。大家都很清楚使用者自定義訊息的範圍,不過,雖然說用會自定義訊息從wm user開始,但是由於我們的工程裡面一般還有很多其他的控制項,他們也要占用一部分wm user訊息範圍,所以我們必須為他們留出一部分範圍,這裡,我們保留100個訊息,一般情況下,這可以滿足我們的要求。1 ...
自定義訊息
自定義訊息的響應和資源訊息的響應有很多類似之處 資源訊息的響應是以資源的id號作為標識的 自定義的訊息要自己宣告訊息id。一 定義 第一步要宣告訊息 definewm mymsgwm user 200 第二步要在類宣告中宣告訊息對映 declare message map 第三步要在類宣告中定義訊息...