///////消息廣播只能將消息傳遞到接收消息的主程序中,MDIChild窗體不能接收到廣播消息;/////////
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); public procedure WndProc(var message:TMessage);override; end; var Form1: TForm1; MyMessage: DWORD; implementation {$R *.dfm} { TForm1 } procedure TForm1.WndProc(var message: TMessage); // 可處理自定義消息 begin if message.Msg=MyMessage then // 第3步:重載Windows消息處理過程,處理接收到的MyMessage消息; ShowMessage(FloatToStr(Handle)+ 'MyMessage'); // 每次程序關閉后再啟動,句柄值不一樣。但不關閉就是同一個值 inherited WndProc(Message); // 其實沒什么用,但是屏蔽后出錯 end; procedure TForm1.Button1Click(Sender: TObject); begin SendMessage(HWND_BROADCAST,MyMessage,0,0); //第2步:發送MyMessage消息,相當於廣播;而且兩個程序都執行了的話,一個處理完另一個才能開始處理。可以試試PostMessage的區別 end; /////////預先注冊好Windows消息;第一種方法//////////////////// procedure TForm1.FormCreate(Sender: TObject); begin //同一字符串,如'MyMessageMe' 在不同的程序中調用RegisterWindowMessage注冊消息時,返回的MyMessage結果是一樣的。這樣為在不同程序之間廣播消息提供了可能。即不同程序注冊消息時,必須注冊相同的注符串。 MyMessage:=RegisterWindowMessage('MyMessageMe'); //第1步:注冊Windows消息,重點在於返回的值MyMessage end; /////////預先注冊好Windows消息;第二種方法//////////////////// { initialization MyMessage:=RegisterWindowMessage('MyMessageMe'); } //BroadcastSystemMessage,可以在進程之間廣播消息; procedure TForm1.SendSMSMessage; var SMSMessage:Cardinal; recipt:Cardinal; begin SMSMessage:=RegisterWindowMessage('SendSMSMessage'); recipt:=BSM_ALLDESKTOPS; //所以桌面程序都可以接收 BroadcastSystemMessage(BSF_POSTMESSAGE,@recipt,SMSMessage,0,0); end; end.
參考:http://www.cnblogs.com/key-ok/p/3417727.html
