delphi – 获取对话框窗口表单的引用(ShowMessage,MsgDialog等)
发布时间:2020-12-15 09:48:14 所属栏目:大数据 来源:网络整理
导读:有没有我可以使用的事件所以我会抓住ShowMessage出现在屏幕上的那一刻?我还需要传递对已显示消息的TForm的引用. 到目前为止,我尝试过OnDeactivate,但看起来,ShowMessage并没有导致它…… 在.NET中有一个关于Application的方法可以捕获每个MessageBox(Applic
有没有我可以使用的事件所以我会抓住ShowMessage出现在屏幕上的那一刻?我还需要传递对已显示消息的TForm的引用.
到目前为止,我尝试过OnDeactivate,但看起来,ShowMessage并没有导致它…… 在.NET中有一个关于Application的方法可以捕获每个MessageBox(Application.AddFilterMessage或类似这样的smth),我在delphi中需要这样的东西 我想要达到的目的是: 解决方法
在现代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调用了一次,但是如果要挂钩应用程序中显示的所有消息对话框,可以在启动时安装它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |