MFC使用SendMessage()發送自定義消息實現進程間通信


1.新建兩個對話框項目,分別在StdAfx.h中添加自定義消息
#define WM_CONTROLPRINT WM_USER+1001
2.發送端,獲得其他窗口句柄的方法FindWindow();
void CAaDlg::OnButtonsend() 
{
     //  TODO: Add your control notification handler code here
    
// 通過窗體名稱,獲取其他進程窗口句柄
    CWnd *pWnd=CWnd::FindWindow(NULL,_T( " Bb ")); 
     if(pWnd==NULL)
    {
        AfxMessageBox( " 接收程序沒有運行! ");
         return ;
    }

    pWnd->SendMessage(WM_CONTROLPRINT,NULL, 0);
}
3.接收端,接收其他進程發過來的消息。
// 消息響應函數
void  OnControlPrint(WPARAM wParam, LPARAM lParam);
void  CBbDlg::OnControlPrint(WPARAM wParam, LPARAM lParam)
{
         if(wParam== 0 && lParam== 0)
            AfxMessageBox( " HelloWorld! ");

         return ;
}
// 添加消息映射
BEGIN_MESSAGE_MAP(CBbDlg, CDialog)
     // {{AFX_MSG_MAP(CBbDlg)
    ON_MESSAGE(WM_CONTROLPRINT, OnControlPrint)
     // }}AFX_MSG_MAP
END_MESSAGE_MAP()
運行結果:

源碼下載: 進程間發消息實例.rar
url: http://greatverve.cnblogs.com/archive/2012/10/01/mfc-SendMessage.html
參考: VCSendMessagePostMessage

SendMessage函數是阻塞的。PostMessage函數是非阻塞的。
SendMessage:
函數功能:該函數將指定的消息發送到一個或多個窗口。此函數為指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而函數PostMessage不同,將一個消息寄送到一個線程的消息隊列后立即返回。

函數原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

參數:

hWnd:其窗口程序將接收消息的窗口的句柄。如果此參數為HWND_BROADCAST,則消息將被發送到系統中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發送到子窗口。

Msg:指定被發送的消息。

wParam:指定附加的消息指定信息。

IParam:指定附加的消息指定信息。

返回值:返回值指定消息處理的結果,依賴於所發送的消息。

備注:需要用HWND_BROADCAST通信的應用程序應當使用函數RegisterWindowMessage來為應用程序間的通信取得一個唯一的消息。

如果指定的窗口是由調用線程創建的,則窗口程序立即作為子程序調用。如果指定的窗口是由不同線程創建的,則系統切換到該線程並調用恰當的窗口程序。線程間的消息只有在線程執行消息檢索代碼時才被處理。發送線程被阻塞直到接收線程處理完消息為止。

Windows CE:Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要檢查發送的消息是否被支持。

速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;頭文件:winuser.h;輸入庫:user32.lib;Unicode:在Windows NT環境下以Unicode和ANSI方式實現。

PostMessage:
函數功能:該函數將一個消息放入(寄送)到與指定窗口創建的線程相聯系消息隊列里,不等待線程處理消息就返回。消息隊列里的消息通過調用GetMessage和PeekMessage取得。

函數原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

參數

hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含義的兩個值:

HWND.BROADCAST:消息被寄送到系統的所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口。消息不被寄送到子窗口。

NULL:此函數的操作和調用參數dwThread設置為當前線程的標識符PostThreadMessage函數一樣。

Msg:指定被寄送的消息。

wParam:指定附加的消息特定的信息。

IParam:指定附加的消息特定的信息。

返回值:如果函數調用成功,返回非零值:如果函數調用失敗,返回值是零。若想獲得更多的錯誤信息,請調用GetLastError函數。

備注:需要以 HWND_BROADCAST方式通信的應用程序應當用函數 RegisterwindwosMessage來獲得應用程序間通信的獨特的消息。

如果發送一個低於WM_USER范圍的消息給異步消息函數(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息參數不能包含指針。否則,操作將會失敗。函數將再接收線程處理消息之前返回,發送者將在內存被使用之前釋放


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM