科技

2012年2月3日 星期五

[MFC]PostMessage的使用方法介紹

PostMessage是個很方便且好玩的東西,能夠讓兩支程式溝通

首先要定義兩者之間的通訊規格 就像開車一樣

左邊方向燈為向左轉 右邊方向燈為向右轉

再來要定義一個message map 以判斷接收到的訊息要用何種function來處理


接下來是一段應用的程式碼,當發送端送訊息到接收端時,接收端根據PostMessage
內容來決定使用HELLO() 或者 HI()

//---接收端----

STEP1 將接收端的程式標題定為一個名稱 這邊用TEST表示

SetWindowText(_T("TEST"));


STEP2 定義溝通規格

#define WM_FUNCTION WM_USER+1

(WM_FUNCTION在這程式的角色為像是通信流程中的"訊息")



STEP3 定義一個Message map

ON_MESSAGE(WM_FUNCTIONT,Select)

(定義當TEST接收到WM_FUNCTION這"訊息"時,利用Select()這個函數處理
記得要放在 DoDataExchange()裡頭,BEGIN_MESSAGE_MAP()部分)


STEP4 設置一個列舉型態
enum{HELLO,HI};

(列舉型態 預設第一個為0 第二個為1 以此類推)



STEP5 撰寫一個判斷PostMessage訊息的function

LRESULT CtestDlg::Select(WPARAM wparam, LPARAM lparam)
{
int m_iSelect = (int)wparam;//將wparam轉為int型態後放入m_iSelect
switch (m_iSelect)
{
case HELLO:
HELLO();
break;
case HI:
HI();
break;
}
return S_OK;
}

//-----發送端---

做完接收端的step2~4後,撰寫一個function來傳送訊息

void CsendDlg::OnBnClickedSend()
{
::PostMessage(::FindWindow(NULL,_T("TEST")),WM_FUNCTION, HELLO, 0);
}


Postmessage的格式請參考MSDN的內容,這邊不做詳細敘述


::FindWindow(NULL,_T("TEST"))即為要將訊息傳送到的裝置
WM_FUNCTION為傳送的訊息
HELLO為之前定義列舉型態中的數值 (WPARAM)
由於lparam的部分在這用不到 所以設為0

如此一來即可完成一支PostMessage應用的小程式了



沒有留言:

張貼留言