C 使用SendMessage傳遞字串

2022-03-31 07:08:22 字數 1007 閱讀 2448

正文:在c#中使用sendmessage,原本以為很簡單的事,卻處處碰壁。

在定義訊息時忘記了使用者可定義訊息的邊界值,在網上一陣瘋找後來發現是const int wm_user = 0x400。接著是sendmessage的lparam型別不能決定(預設是intptr),我想傳送字串資訊,就將它定為了string型,然後通過重寫defwndproc接收自定義訊息。問題出現:(string) message.lparam提示不能轉換,然後使用另一種方法:(string)message.getlparam(typeof(string)),依然有錯,提示應該過載string的建構函式建立string的無參建構函式(夠狠)。

後來在網上見到一篇文章「c#用wm_copydata訊息來實現兩個程序之間傳遞資料」,經提示想到一方法:用結構體封裝string欄位,然後傳結構體就可以了(結構體有自己的無參建構函式--其實原本想自己寫個無參建構函式,卻發現在vs2005下無法編譯通過,提示不能夠建立結構體的無參建構函式)。這樣就可以在defwndproc中通過 (tagstructstr)message.getlparam(typeof(tagstructstr)) 將lparam轉換為結構體型別,然後取出它的字串欄位就實現了string的傳送了。

事還沒完,一次偶爾碰到有人說可以使用marshal轉換string。自己查了下msdn於是乙個傳送string的另一方法產生:sendmessage仍然是傳string,在defwndproc中可以用 string str = marshal.ptrtostringansi(m.lparam) 將intptr型別的lparam轉換為string型別,其實還可以使用 intptr p = marshal.stringtohglobalansi(s) 將string型別轉換為intptr型別。

進一步深究,發現這其中還有內情:sendmessage使系統api,intptr屬於非託管型別,而我們在c#中使用的string等型別是託管型別,使用marshal轉換其實真正意義是實現了託管與非託管型別的轉換。看來在c#與非託管的c++/c進行互動傳遞資料時,要少不了marshal的身影了。

在C 中使用SendMessage

在c 中使用sendmessage 日期 2005 02 04 備註 主要描述在呼叫api函式sendmessage時資料型別的轉換。sendmessage是乙個在user32.dll中宣告的api函式,在c 中匯入如下 using system.runtime.interopservices dl...

C 使用SendMessage傳遞字串

在c 中使用sendmessage,原本以為很簡單的事,卻處處碰壁。在定義訊息時忘記了使用者可定義訊息的邊界值,在網上一陣瘋找後來發現是const int wm user 0x400。接著是sendmessage的lparam型別不能決定 預設是intptr 我想傳送字串資訊,就將它定為了strin...

C 使用SendMessage實現程序間通訊的方法

為了深入理解訊息機制,先來做乙個測試專案 在新建專案的form1的 中,加入方法 protected override void defwndproc ref message m else base.defwndproc ref m 此方法重寫了窗體的訊息截獲 執行後會發現,滑鼠一移向窗體就會彈窗 ...