有没有我可以使用的事件所以我会抓住ShowMessage出现在屏幕上的那一刻?我还需要传递对已显示消息的TForm的引用.
到目前为止,我尝试过OnDeactivate,但看起来,ShowMessage并没有导致它……
在.NET中有一个关于Application的方法可以捕获每个MessageBox(Application.AddFilterMessage或类似这样的smth),我在delphi中需要这样的东西
我想要达到的目的是:
我必须抓住一个对话窗口出现的时刻(或者只是一个模态窗口,但它并不那么舒服).我需要做几个指令.这些说明的目标是给我一个刚刚收到的DialogWindow的参考,所以我可以得到一些位于它上面的按钮.
解决方法
在现代Delphi版本中,在现代
Windows版本中,ShowMessage会生成Windows对话框窗口.您可以使用WH_CBT挂钩来捕获该对话框窗口的激活.
function CBTProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var wnd: HWND; ClassName: string; begin if nCode=HCBT_ACTIVATE then begin wnd := wParam; SetLength(ClassName,256); SetLength(ClassName,GetClassName(wnd,PChar(ClassName),Length(ClassName))); if (ClassName='#32770') or (ClassName='TMessageForm') then Beep; end; Result := CallNextHookEx(0,nCode,wParam,lParam); end; procedure TForm1.Button1Click(Sender: TObject); var Hook: HHOOK; begin Hook := SetWindowsHookEx(WH_CBT,CBTProc,HInstance,GetCurrentThreadId); if Hook=0 then RaiseLastOSError; try ShowMessage('hello'); finally if not UnhookWindowsHookEx(Hook) then RaiseLastOSError; end; end;
请注意,实际的窗口类名称因系统而异.在XP上,类名将是TMessageForm,因为该对话框实际上是一个Delphi TForm.但是,在Vista上以后,对话框是一个标准窗口消息框对话框,窗口类名称为#32770.
我已经向ShowMessage调用了一次,但是如果要挂钩应用程序中显示的所有消息对话框,可以在启动时安装它.