跨程序訊息以及資料傳送

2021-06-25 13:27:49 字數 1111 閱讀 3982

跨程序訊息以及資料傳送

訊息機制是windows的乙個特點。在windows開發中基本上都會用到訊息傳送以及接收,突別是對於ui介面開發這一塊。程序之間相互通訊的方式有很多,其中包括跨程序訊息。

訊息傳送 最常用的是使用sendmessage以及postmessage 系統api函式,訊息發到指定的視窗。不管是

程序內或程序外我們都可以通過findwindow 得到視窗控制代碼。

在程序內傳送訊息,我們可以傳送一切所有定義的訊息,如系統訊息,或自定的訊息,並通過lparam或wparam引數傳遞資料。因為我們所使用的資料記憶體是在同一程序內。那如果不是同乙個程序內,還可以通過sendmessage以及postmessage 系統api函式的lparam或wparam 引數傳遞資料嗎? 答案是可以的,只是不能以程序內傳送訊息傳遞資料的方式。

不管是程序內還是程序外,訊息都是會傳送到系統訊息佇列裡,然後由系統訊息制機分發到指定視窗的。那麼

有人會問為何

不能以程序內

傳送訊息傳遞資料的方式呢? 因為,程序內與程序外資料的記憶體塊並非在同乙個區域,訊息可以傳送另外乙個程序,但卻不能訪問程序外的資料,因而不能實現資料傳遞。

跨程序傳送資料,windows 

系統提供乙個強大的訊息wm_copydata。

wm_copydata可以實現程序間傳遞資料,但也就僅止於wm_copydata訊息內處理,不能傳送控制項定義的訊息,以及自定義的訊息。wm_copydata 討論的程序間資料傳遞的方法,那麼除了wm_copydata訊息外,還有什麼方法可以跨程序傳送訊息傳遞資料呢?

我們可以通過

virtualallocex 函式。它的作用是在指定進

程的虛擬空間

保留或提

交記憶體區域。下現這用這方法實現跨程序傳送系統訊息,傳遞事件資料內容。以tab控制項為例

//查詢視窗控制代碼

hwnd hwnd = ::findwindow(null,_t("mfctabtest"));

if (hwnd)}}

除了wm_copydata外,

利用虛擬空間

也可以方便實現程序間資料通訊

。並且訊息型別更完整,不管是系統訊息還是自己定義的訊息可以跨程序傳送訊息傳遞資料。

程序傳送訊息

region 程序傳送訊息 public const int wm copydata 0x004a dllimport user32.dll entrypoint findwindow public static extern intptr findwindow string lpclassname...

WinForm 跨程序傳輸資料

public class winmessagehelper 使用copydata進行跨程序通訊 public const intwm copydata 0x004a dllimport user32.dll entrypoint sendmessage private static extern i...

Linux程序間利用訊息佇列傳送資料

訊息佇列是linux系統程序之間通訊一種方式,除此之外,程序通訊方式還有多種。本文僅討論訊息佇列通訊方式。訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少 管道只能承載無格式位元組流以及緩衝區大小受限等缺點。訊息佇列函式由msgget msgctl msgs...