WPF向系統傳送訊息 並傳遞結構體

2022-06-02 08:42:09 字數 1724 閱讀 8685

場景 :需要開發乙個通訊元件 流程為:介面-開啟接收服務-通過傳送元件傳送資訊到 其他客戶端和服務端

接受服務接收其他客戶端傳送的訊息 需要傳遞給對應元件或者介面 因此會出現類庫重複引用問題。因為採用訊息佇列,和資料庫中轉來傳遞訊息需要每個元件知道太多其他元件的業務,並且耗損效能和時間更多一下因此都被排除掉。最後採用windows api傳遞訊息

後續如果有更好地辦法再繼續更新上來

由於專案程序間和執行緒間需要進行通訊,因此通過api呼叫windows底層訊息傳遞

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

public static extern int postmessage(intptr wnd, int msg, intptr wp, intptr lp); 

但是由於程式開發是wpf因此與傳統的winform呼叫 postmessage 訊息有一定區別,並且無法傳遞結構體

因此通過實驗和調查實現了wpf呼叫postmessage傳遞訊息,並且支援傳遞結構體**換概念:現將結構體進行轉換為16進製制,winproc接收後在進行轉換為結構體) 具體**如下:

///

/// receive message window form handle 訊息接收視窗控制代碼

///

public static intptr handle;

///

/// postmessage dll import api方法

///

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

public static extern int postmessage(intptr wnd, int msg, intptr wp, intptr lp);

///

/// message data struct  結構體

///

public struct messagedatastruct

///

/// user-defined message no 自定義訊息

///

public const int user_message = 0x0400;

傳送訊息

///

/// send mesage data to window message queue

///

/// message data

public void postmessagetomessagequeue(messagedatastruct messagedata)

windows訊息接收

呼叫系統winproc方法

void win_sourceinitialized(object sender, eventargs e)

}protected override void onsourceinitialized(eventargs e)

#region usb識別操

private intptr windowproc(intptr hwnd, int msg, intptr wparam, intptr lparam, ref bool handled)

return result;}}

#endregion 

//將窗控制代碼賦值給服務

private void window_loaded(object sender, routedeventargs e)

向系統傳送模擬按鍵訊息

1 顯示桌面 很多軟體有顯示桌面的功能,並且大家的方法都是遍歷視窗,然後讓它們最小化,其實 win系統給咱們了乙個非常方便的win鍵 就是鍵盤上在ctrl鍵和alt鍵之間的那個帶win標誌的按鍵 利用它,可以輕鬆的完成顯示桌面的功能.keybd event vk lwin,0,0 0 keybd e...

Wpf訊息迴圈之訊息傳遞

幾天遇見乙個問題需要檢查某個wpf程式是否已經執行,如果沒有執行則啟動傳遞引數,如果已執行則需要直接傳遞訊息。在沒有執行 情況下傳遞引數很簡單,我們只需要process cmd視窗啟動並傳遞引數,在程式中處理。但是如果程式已經啟動有點麻煩,憑著我曾winform的經驗第一時間想到的是win32 ap...

程序間傳遞訊息(傳送和接收系統訊息)

unit unit1 inte ce uses windows,messages,sysutils,variants,classes,graphics,controls,forms,dialogs,stdctrls type tform1 class tform button1 tbutton pr...