我已经从本文复制的代码发送的消息: Controlling the number of application instances应用程序主形式不接收经由的SendMessage
然而,由SendMessage消息发送的消息没有被主要形式“抓住”。
这是DPR文件中的代码,我们正在注册的消息,然后播放它,如果应用程序的实例已在运行:
var
Mutex: THandle;
begin
MyMsg := RegisterWindowMessage('Show_Main_Form');
Mutex := CreateMutex(nil, True, 'B8C24BD7-4CFB-457E-841E-1978A8ED0B16');
if (Mutex = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then
begin
SendMessage(HWND_BROADCAST, MyMsg, 0, 0);
end
这是从主窗体代码:
var
fmMain: TfmMain;
MyMsg: Cardinal;
implementation
uses
uSettings;
{$R *.dfm}
procedure TfmMain.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if (Msg.Message = MyMsg) then
begin
beep;
Application.Restore;
Application.MainForm.Visible := True;
SetForeGroundWindow(Application.MainForm.Handle);
Handled := True;
end;
end;
procedure TfmMain.FormCreate(Sender: TObject);
begin
Application.OnMessage := AppMessage;
end;
问题是程序AppMessage没有被调用。哪里不对?
> *“一个对该消息作出反应的程序..”*>风险是其他一些应用程序也注册了'Show_Main_Form'消息。虽然不是很高,但我认为,尽管如此,这个消息可能不是通用的.. –
@Sertac写得很差的程序可能会对某条消息做出回应,而不会检查消息的值。 –
重写'WndProc()'的另一种方法是调用['Application.HookMainWindow()'](http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TApplication.HookMainWindow),它将安装消息挂钩到“TApplication”窗口过程中。由于它也是一个顶级窗口,它也将接收广播的消息。 –