介绍
BroadcastSystemMessage函数 可以发送一个消息给指定一类接受者(从Broadcast就可以看出,广播的意思)。这里的接受者可以是,一般的应用程序、可装载的驱动程序、网络驱动程序、系统级的设备驱动程序 或者 上述的任意组合。
函数原型
long BroadcastSystemMessage(
// 广播选项
DWORD flags,
// in:指定接受这个消息的接受者类别;out:实际接收消息的接受者类别
LPDWORD lpInfo,
// 消息ID
UINT Msg,
// 消息参数1
WPARAM wParam,
// 消息参数2
LPARAM lParam
);
下面我们来 具体讲解参数:
flags
广播选项,可以是下面中的1个 或者 多个组合。
Value | Meaning |
---|---|
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
输入输出变量。作为输入变量时,指定接受这个消息的接受者类别;作为输出变量时,当函数返回时 该变量为 实际接收消息的接受者类别。
Value | Meaning |
---|---|
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, // 消息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;
}
// ...
}