使用Windows API實現兩個進程間(含窗體)的通信在Windows下的兩個進程之間通信通常有多種實現方式,在.NET中,有如命名管道、消息隊列、共享內存等實現方式,這篇文章要講的是使用Windows的API來實現簡單的進程間通信,這兩個進程既可以都是基於C#開發,也可以都是基於C++開發,也可以是一個C#開發而另一個為C++開發,在C++開發方面,不需要額外調用Windows的API,而是可以直接使用相關方法即可。所以,這里重點要講的就是在C#中是如何做的,而至於在C++中是如何做的將給出例子,並不做詳述。
對於接收消息,只需要重寫DefWndProc函數即可,對於發送消息,筆者編寫了一個類MsgHandler來實現。要順利實現消息的接收與發送,使用了Windows的API:FindWindow、SendMessage等。在C#環境中,通過DllImport來引入相應的API,代碼示例如下:
筆者查閱了相關網絡資源,發現很少有提及使用自定義消息來發送和接收消息的,幾乎都是使用了系統消息WM_COPYDATA來實現。在本例中,筆者除了使用系統消息WM_COPYDATA來收發消息外,還將使用自定義消息來實現收發消息。不過,值得注意的是,筆者在測試過程中發現,使用自定義的消息來收發結構體時發生了一些異常,該異常提示說內存不能讀,對於該問題,還有待進一步解決,當然,若是哪位前輩或朋友有遇到過該問題並已順利解決的話,不妨告知,筆者將洗耳恭聽。
消息發送類MsgHandler的代碼示例如下:
消息接收重寫了DefWndProc方法,其代碼示例如下:
消息的接收與發送最終通過一個WinForm展現出來,其代碼實現如下:
通過上述的C#部分的代碼,已經可以實現兩個C#窗體間的通信,其界面截圖如下圖所示:
那么,在C++中又是如何實現的呢?這個其實也是很簡單的。要實現消息的收發,同理也要重寫WindowProc以便於接收消息,而通過調用方法亦可實現消息的發送。
對於消息接收,如果是系統消息,可以通過OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)事件完成;如果是自定義消息,可以通過重寫WindowProc完成。代碼示例如下:
對於消息發送,只需要調用形如SendMessage(m_hwndMsg, WM_DATA_TRANSFER, wParam, lParam)方法即可實現,lParam參數可以是PCOPYDATASTRUCT等。
通過上面的介紹,相信已經可以輕松實現兩個進程間(含窗體)的通信的,使用這樣的方法,既簡單又能夠滿足大部分的應用需求,不失為一種簡便的方法。