Windows编程—BroadcastSystemMessage函数详解

介绍

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

函数原型

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

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

flags

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

ValueMeaning
BSF_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

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

ValueMeaning
BSM_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;
	}
    // ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值