Windows编程—BroadcastSystemMessage函数详解
生活随笔
收集整理的這篇文章主要介紹了
Windows编程—BroadcastSystemMessage函数详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
介紹
BroadcastSystemMessage函數 可以發送一個消息給指定一類接受者(從Broadcast就可以看出,廣播的意思)。這里的接受者可以是,一般的應用程序、可裝載的驅動程序、網絡驅動程序、系統級的設備驅動程序 或者 上述的任意組合。
函數原型
long BroadcastSystemMessage(// 廣播選項DWORD flags,// in:指定接受這個消息的接受者類別;out:實際接收消息的接受者類別LPDWORD lpInfo,// 消息IDUINT Msg,// 消息參數1WPARAM wParam,// 消息參數2LPARAM lParam );下面我們來 具體講解參數:
flags
廣播選項,可以是下面中的1個 或者 多個組合。
| BSF_ALLOWSFW | 從名字上拆解,Broadcast System Flag,allow set foreground window。允許接受者在處理消息的時候將窗口設置為前置窗口。 |
| BSF_FLUSHDISK | Flush Disk,在每個接受者處理完消息后刷新磁盤 |
| BSF_FORCEIFHUNG | force if hung,繼續廣播 即時接受者之一沒有響應 或者 超時 |
| BSF_IGNORECURRENTTASK | ignore current task,忽略掉當前任務 也就是自己,消息不會發到當前程序 |
| BSF_NOHANG | no hang,不要懸掛,沒有響應的應用程序視作超時。其中一個接受者超時就不再繼續廣播。 |
| BSF_NOTIMEOUTIFNOTHUNG | no time out if no hung,只要接受者沒有給不響應的動作,就一直等待這個消息的響應,不做超時處理。 |
| BSF_POSTMESSAGE | post message,使用post方式發送消息,不能和BSF_QUERY組合使用 |
| BSF_QUERY | 一次發送一個消息,當前接受者返回TRUE之后才會繼續往后發 |
| BSF_SENDNOTIFYMESSAGE | 使用SendNotifyMessage函數發送消息,不能夠和BSF_QUERY組合使用 |
lpInfo
輸入輸出變量。作為輸入變量時,指定接受這個消息的接受者類別;作為輸出變量時,當函數返回時 該變量為 實際接收消息的接受者類別。
| BSM_ALLCOMPONENTS | broadcast system message, 廣播給所有系統組件 |
| BSM_ALLDESKTOPS | 廣播給所有的桌面,需要SE_TCB_NAME設置特權 |
| BSM_APPLICATIONS | 廣播給所有的應用程序 |
Msg
消息ID,這里我們一般不直接寫消息ID,而是用一個字符串來創建一個消息ID,RegisterWindowMessage
wParam、lParam,消息攜帶參數。
用法
一般這里廣播消息,都是廣播給我們自己的程序使用的,不然別的程序又不認識你。
筆者在項目有這樣用過這個函數,我們的程序只有一個實例,如果發現是再次打開就把之前打開的程序前置顯示,這里通知已打開的程序就是使用的 BroadcastSystemMessage函數去通知的。
具體代碼如下:
// 程序啟動入口 BOOL CMyApp::InitInstance() {CString strAppName = _T("AC32BEA6-58BB-4EB5-A52A-15C7CA2139E5");HANDLE hMutex = CreateMutex( NULL, TRUE, strAppName );if ( GetLastError() == ERROR_ALREADY_EXISTS ){static UINT showMyAppMsg = RegisterWindowMessage( L"MYAPP_SHOW" );DWORD dwRecipients = BSM_APPLICATIONS; // 只給一般的應用程序廣播BroadcastSystemMessage( BSF_POSTMESSAGE, // Post message方式&dwRecipients, // 只給一般的應用程序廣播showMyAppMsg, // 消息ID0,0 ); return FALSE;}// ... }// 窗口的消息處理函數 LRESULT CMyDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) {LRESULT lrst=CWnd::DefWindowProc(message, wParam, lParam);static UINT showMyAppMsg = RegisterWindowMessage( L"MYAPP_SHOW" );if ( message == showMyAppMsg ){ShowWindow( SW_SHOW );SetForegroundWindow();return lrst;}// ... } 新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Windows编程—BroadcastSystemMessage函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式:工厂方法模式(C++)【简单工
- 下一篇: 操作系统实践(八)