delphi – 获取对话框窗口表单的引用(ShowMessage,MsgDialog等)

有没有我可以使用的事件所以我会抓住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调用了一次,但是如果要挂钩应用程序中显示的所有消息对话框,可以在启动时安装它.

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...