unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;typeTForm1 = 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消息,重点在于返回的值MyMessageend;/////////预先注册好Windows消息;第二种方法////////////////////{ initializationMyMessage:=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.
联系客服