winuser.h中的sendMessage函數

1.新建一個Dialog  based的MFC工程MSG

2.在資源管理器中打開對話框IDD_MSG_DIALOG,在其中放置一下控件:

  (1)ID號爲ID_SENDMSG的發送消息按鈕(原IDOK按鈕)

(2)ID號爲IDCANCEL的取消按鈕

(3)ID號爲IDC_STATIC的靜態控件,CAPTION爲“您發送消息的次數統計:”

(4)ID號爲IDC_EDIT的編輯控件。

3.在MSGDlg.h頭文件中自定義消息:#define WM_COUNT_MSG WM_USER+100

4.在MSGDlg.h頭文件中添加消息處理函數的聲明

afx_msg LRESULT OnCountMsg(WPARAM,LPARAM);

5. 在CMSGDlg類實現文件MSGDlg.cpp中的消息映射表中加入自定義消息映射:

BEGIN_MESSAGE_MAP(CMSGDlg, CDialog)

     //{{AFX_MSG_MAP(CMSGDlg)

     ON_WM_SYSCOMMAND()

     ON_WM_PAINT()

     ON_WM_QUERYDRAGICON()

     ON_MESSAGE(WM_COUNT_MSG,OnCountMsg)

     ON_BN_CLICKED(ID_SENDMSG, OnSendmsg)

     //}}AFX_MSG_MAP

END_MESSAGE_MAP()

6.在CMSGDlg類實現文件MSGDlg.cpp中定義“發消息”按鈕消息響應

void CMSGDlg::OnSendmsg()

{

     // TODO: Add your control notification handler code here

     staticint count;

     ++count;

     this->SendMessage(WM_COUNT_MSG,0,count); 

}

7.在CMSGDlg類實現文件MSGDlg.cpp中定義OnCountMsg消息響應

//自定義消息處理函數

LRESULT CMSGDlg::OnCountMsg(WPARAM wParam,LPARAM lParam)

{

     this->SetDlgItemInt(IDC_EDIT,lParam);

     return 1;

}

8.SendMessage函數的API原型爲:

LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

其中hWnd標識接收消息的窗口。

以下程序用來向記事本Notepad發送一個WM_CLOSE消息以關閉記事本窗口。

// TellToClose.cpp文件

//::FindWindow&::SendMessage

#include"stdafx.h"

#include<windows.h>

int main(int argc,char* argv[])

{

     // 查找標題爲“無標題- 記事本”的窗口

     // 也可以使用類名來查找,如

// HWND hWnd =::FindWindow("Notepad", NULL);

     HWND hWnd = ::FindWindow(NULL, "無標題- 記事本");

     if(hWnd != NULL)

     {

         // 向目標窗口發送WM_CLOSE消息

         ::SendMessage(hWnd, WM_CLOSE, 0, 0);

     }

     return 0;

}

另外還有一個函數:

BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

注意SendMessage直到消息被處理完畢後才返回,而PostMessage是把一條消息投放到創建hWnd窗口的線程的消息隊列中。函數不等消息被處理就立即返回。

如果開啓了記事本程序,則運行以上程序記事本關閉。

另附PeekMessage和GetMessage的區別:

PeekMessage  返回   TRUE  的條件是有消息,如果沒有消息返回   FALSE   
GetMessage
    返回   TRUE  的條件是有消息且該消息不爲   WM_QUIT  
                返回   FALSE  的條件是有消息且該消息  爲   WM_QUIT

9.在MFC中SendMessage函數封裝到CWnd類中:

CWnd::SendMessage

LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
返回值:消息處理的結果;它的值依賴於發送的消息。
參數:

message指定了要發送的消息;

wParam和lParam指定了與消息有關的附加信息。

wParam和lParam是Windows消息機制的兩個最重要參數,整個Windows依靠這兩個參數傳遞各種各樣的消息。

首先是wParam,它表示此次的消息類型是什麼。是鍵盤?是鼠標?鍵盤裏又分按下還是擡起,鼠標裏又分是單擊還是雙擊,等等。

lParam是一個指針,它指向本條消息所存儲的信息的內存區域的首地址,很顯然,這個地址存放的東西是很靈活的,比如鼠標消息,那麼這裏可能存放的是各鍵的狀態或者光標的X,Y座標。換成鍵盤消息,則是鍵碼等等。

總之,在Windows系統消息處理中,wParam參數區分了類別,lParam參數存放了該類別所存儲的信息。

對於自定義消息,我們把消息Msg投遞(Send或Post)到 hWnd,其對應的消息處理函數一般爲afx_msg LRESULT OnMsg(WPARAM,LPARAM);格式,故我們可以自定義這兩個參數,以傳遞所需參數(一般爲常規類型、結構或類的指針)到指定窗口線程。

例如: SendMessage(WM_MYMESSAGE,(WPARAM)lpMyData1,(LPARAM)lpMyData2);

參考:

1.http://topic.csdn.net/t/20021223/15/1291875.html

2. http://blog.sina.com.cn/s/blog_4a657c5a0100cgxy.html

3.《Windows程序設計》王豔平

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章