當前位置:編程學習大全網 - 源碼下載 - api函數BroadcastSystemMessage求詳解

api函數BroadcastSystemMessage求詳解

頂級窗口就是應用程序的主窗口,比如妳用寫字板,寫字板上面的每個按鈕,每個對話框都是寫字板主窗口的子窗口,頂級窗口,就是寫字板程序本身的最高級窗口 

函數功能:  該函數發送消息給指定的接受者。接受者可以是壹個應用程序、安裝驅動器、網絡驅動器、系統級設備驅動器或這些系統組件的組合。  函數原型:long BroadcastSystemMessage(DWORD dwFIags,LPDWORD IpdwRecipients,UINT UiMessage,WPARAMwParam,LPARAM IParam);  參數: dwFlags:選項標誌。可取下列值的組合:  BSF_FLUSHDISK:接受者處理消息之後清洗磁盤。  BSF_FORCEIFHUNG:繼續廣播消息,即使超時周期結束或壹個接受者已掛起。 BSF_IGNORECURRENTTASK:不發送消息給屬於當前任務的窗口。這樣,應用程序就不會接收自己的消息。  BSF_NOHANG:強制掛起的應用程序超時。如果壹個接受者超時,不再繼續廣播消息。 BSF_NOTIMEOUTIFNOTHUNG:只要接受者沒掛起,壹直等待對消息的響應。不會出現超時。 BSF_POSTMESSAGE:寄送消息。不能和BSF_QUERY組合使用。  BSF_QUERY:每次發送消息給壹個接受者,只有當前接受者返回TRUE後,才能發送給下壹個接受者。 lpdwRecipients:指向變量的指針,該變量含有和接收消息接受者的信息。此變量可為下列值的組合: BSM_ALLCOMPONENTS:廣播到所有的系統組件。  BSM_ALLDESKTOPS:Windows NT下,廣播到所有的桌面。要求SE_TCB_NAME特權。  BSM_APPLICATIONS:廣播到應用程序。  BSM_INSTALLABLEDRIVERS:Windows 95下,廣播到安裝驅動器。  BSM_INTDRIVER:Windows 95下,廣播到網絡驅動器。  BSM_VXDS:Windows 95下,廣播到所有系統級設備驅動器。  當函數返回時,此變量接受上述值的組合,以確定真正接受消息的接受者。如果此參數為NULL,則將消息廣播到所有的組件。  uiMessage:系統消息標識符。廣播的消息  WParam:32位消息特定值。  IParam:32位消息特定值。  返回值:如果函數調用成功,返回值是正數。如果函數不能廣播消息,返回值是C1。如果參數dwFlags為BSF_QUERY且至少壹個接受者返回BROADCAST_QUERY_DENY給相應的消息,返回值是零。若想獲得更多的錯誤信息,請調用GetLastError函數。 備註:如果BSF_QUERY沒指定,函數發送指定的消息給所有請求的接受者,並忽略這些接受者返回的值。 速查:Windows NT:4.0及以上版本:Windows:95及以上版本;Windows CE:不支持;頭文件:winuser.h;輸入庫:user32.lib;Unicode:在Windows NT環境下以Unicode和ANSI方式實現。

==================================================================================

與其他應用程序通信

前面我們講的消息傳遞都是基於同壹個應用程序的,但是在某些情況下我們可能需要向其他的應用程序發送消息,這時候我們可以采用SendMessage()函數向目標應用程序的某個窗口的句柄發送消息。其中的技巧在於獲取該窗口的句柄。同時使用RegisterWindowMessage()函數創建壹個唯壹的消息,並且兩個應用程序相互都了解這條消息的含義。同時還會用到BrodcastSystemMessage()函數,它可以向系統中的每個應用程序的主窗口發送消息。這樣便可以避免出現獲取另壹個應用程序窗口句柄的問題。BroadcastSystemMessage()函數提供了附加的標誌BSF_LPARAMPOINTER,可以將寫入參數lParam的指針轉化為可以被目標程序用來訪問程序空間的指針,但是這個標誌可能尚未進行文檔標準化。

方法如下:

首先註冊自己的窗口消息。不過我們這次不用WM_USER+1的技術,註冊窗口消息的好處是不必費心考慮WM_USER加上某個數之後,所表示的消息標識符是否超出工程的允許範圍。本例在兩個工程中都使用文本字符串來註冊消息。由於這個文本字符串在整個系統中應當是唯壹的,因此將使用壹種稱為GUID的COM技術來命名消息。GUID名字生成器程序可以在MFC的BIN目錄下找到,其可執行文件名為GUIDGEN.EXE。該程序將生成在應用程序已知範圍內認為是唯壹的文本字符串,這對應用程序來說當然是最好不過的。

1) 註冊壹個唯壹的窗口消息

使用GUIDGEN.EXE生成壹個GUID。

在應用程序中把GUID定義為窗口消息文本字符串:#define HELLO_MSG “{6047CCB1-E4E7-11d1-9B7E-00AA003D8695}”

使用::RegisterWindowsMessage()註冊該窗口消息文本字符串:idHelloMsg = ::RegisterWindowMessage( HELLO_MSG );

保存消息標識符idHelloMsg,便於以後使用。

2) 向其他應用程序發送消息

使用::RegisterWindowsMessage()返回的消息標識符發送消息,可使用以下代碼:

::SendMessage(hWnd, idHelloMsg,wParam,lParam);

以上代碼假定事先可以通過某種方式獲取目標應用程序的某個窗口的句柄。壹個指向CWnd類的指針不能在程序範圍之外而發揮作用。但是可以在CWnd 類中封裝已獲取的窗口句柄,並如下所示來發送消息:

CWnd wnd;

wnd.Attach( hWnd );

wnd.SendMessage( idHelloMsg,wParam,lParam );

3) 接收已註冊的窗口消息

為接收已註冊的窗口消息,需要在接收窗口類,壹般為CMainFrame中手工添加ON_REGISTERED_MESSAGE消息宏到消息映射中:

BEGIN_MESSAGE_MAP( CMainFrame, CMDIFrameWnd )

// {{AFX_MSG_MAP( CMainFrame ) <br>// }}AFX_MSG_MAP

ON_REGISTERED_MESSAGE( idHelloMsg,OnHelloMsg )

END_MESSAGE_MAP()

有關已註冊消息的消息處理函數的代碼如下:

LRESULT CMainFrame::OnHelloMsg( WPARAM wParam,LPARAM lParam )

{

// process message

return 0;

}

該實例到目前為止,壹直假定事先可以通過某種方式取得目標應用程序的某個窗口的句柄。但這是壹個困難的任務。簡單的方法是向每個應用程序廣播壹條消息,並且希望目標程序正在監聽。由於在系統中註冊了壹條唯壹的消息,因此只有目標程序會響應這條消息。應用程序廣播的消息可能是它自己的窗口句柄,於是接收程序可以使用::SendMessage()來發送應答,也可能是用窗口句柄來結束循環。

4) 廣播窗口消息

使用下面的代碼廣播窗口消息:

WPARAM wParam = xxx;

LPARAM lParam = xxx;

DWORD dwRecipients = BSM_APPLICATIONS;

::BroadcastSystemMessage( BSF_IGNORECURRENTTASK,&dwRecipients,idHelloMsg,wParam,lParam );

===================================================================================

例子在百度妳搜索 BroadcastSystemMessage例子 很多的,自己找吧

  • 上一篇:丁丁地圖的發展歷程
  • 下一篇:二次元如何測量 同心度 垂直度
  • copyright 2024編程學習大全網