場景 :需要開發乙個通訊元件 流程為:介面-開啟接收服務-通過傳送元件傳送資訊到 其他客戶端和服務端
接受服務接收其他客戶端傳送的訊息 需要傳遞給對應元件或者介面 因此會出現類庫重複引用問題。因為採用訊息佇列,和資料庫中轉來傳遞訊息需要每個元件知道太多其他元件的業務,並且耗損效能和時間更多一下因此都被排除掉。最後採用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...