Windows编程—BroadcastSystemMessage函数详解

    科技2022-07-12  115

    介绍

    BroadcastSystemMessage函数 可以发送一个消息给指定一类接受者(从Broadcast就可以看出,广播的意思)。这里的接受者可以是,一般的应用程序、可装载的驱动程序、网络驱动程序、系统级的设备驱动程序 或者 上述的任意组合。

    函数原型

    long BroadcastSystemMessage( // 广播选项 DWORD flags, // in:指定接受这个消息的接受者类别;out:实际接收消息的接受者类别 LPDWORD lpInfo, // 消息ID UINT Msg, // 消息参数1 WPARAM wParam, // 消息参数2 LPARAM lParam );

    下面我们来 具体讲解参数:

    flags

    广播选项,可以是下面中的1个 或者 多个组合。

    ValueMeaningBSF_ALLOWSFW从名字上拆解,Broadcast System Flag,allow set foreground window。允许接受者在处理消息的时候将窗口设置为前置窗口。BSF_FLUSHDISKFlush Disk,在每个接受者处理完消息后刷新磁盘BSF_FORCEIFHUNGforce if hung,继续广播 即时接受者之一没有响应 或者 超时BSF_IGNORECURRENTTASKignore current task,忽略掉当前任务 也就是自己,消息不会发到当前程序BSF_NOHANGno hang,不要悬挂,没有响应的应用程序视作超时。其中一个接受者超时就不再继续广播。BSF_NOTIMEOUTIFNOTHUNGno time out if no hung,只要接受者没有给不响应的动作,就一直等待这个消息的响应,不做超时处理。BSF_POSTMESSAGEpost message,使用post方式发送消息,不能和BSF_QUERY组合使用BSF_QUERY一次发送一个消息,当前接受者返回TRUE之后才会继续往后发BSF_SENDNOTIFYMESSAGE使用SendNotifyMessage函数发送消息,不能够和BSF_QUERY组合使用

    lpInfo

    输入输出变量。作为输入变量时,指定接受这个消息的接受者类别;作为输出变量时,当函数返回时 该变量为 实际接收消息的接受者类别。

    ValueMeaningBSM_ALLCOMPONENTSbroadcast 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, // 消息ID 0, 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; } // ... }
    Processed: 0.014, SQL: 8