Delphi消息的廣播方式(先RegisterWindowMessage,后SendMessage HWND_BROADCAST,最后改寫接收窗口的WndProc)


///////消息廣播只能將消息傳遞到接收消息的主程序中,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM