gpt4 book ai didi

Delphi:检测何时创建新表单

转载 作者:行者123 更新时间:2023-12-03 18:16:44 26 4
gpt4 key购买 nike

我想检测何时创建了新表单。

现在我使用 Screen.ActiveFormChange 事件并检查 Screen.CustomForms 中的新表单,但是 ActiveFormChange 之后被触发窗体的 OnShow 事件。

我想在触发 OnShow 之前检测表单。有没有办法在不修改 Vcl.Forms 单元的情况下做到这一点?

我想检测所有表单(还有 Delphi 模态消息等),因此从自定义类继承所有表单是不可能的(如果我错了请纠正我)。

或者,是否有可能检测到新组件已添加到某些 TComponent.FComponents 列表中?

最佳答案

您可以使用 SetWindowsHookEx函数来安装一个WH_CBT Hook,那么你必须实现一个CBTProc callback函数并最终拦截此 Hook 的可能代码值之一。在这种情况下,您可以尝试使用 HCBT_ACTIVATEHCBT_CREATEWND

检查此示例中的 HCBT_ACTIVATE 代码。

var
hhk: HHOOK;

function CBT_FUNC(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
const
ClassNameBufferSize = 1024;
var
hWindow: HWND;
RetVal : Integer;
ClassNameBuffer: Array[0..ClassNameBufferSize-1] of Char;
begin
Result := CallNextHookEx(hhk, nCode, wParam, lParam);
if nCode<0 then exit;
case nCode of
HCBT_ACTIVATE:
begin
hWindow := HWND(wParam);
if (hWindow>0) then
begin
RetVal := GetClassName(wParam, ClassNameBuffer, SizeOf(ClassNameBuffer));
if RetVal>0 then
begin
//do something
OutputDebugString(ClassNameBuffer);
end;
end;
end;
end;

end;

Procedure InitHook();
var
dwThreadID : DWORD;
begin
dwThreadID := GetCurrentThreadId;
hhk := SetWindowsHookEx(WH_CBT, @CBT_FUNC, hInstance, dwThreadID);
if hhk=0 then RaiseLastOSError;
end;

Procedure KillHook();
begin
if (hhk <> 0) then
UnhookWindowsHookEx(hhk);
end;

initialization
InitHook();

finalization
KillHook();

end.

Note : if you uses the HCBT_CREATEWND code instead you will intercept any window created by the system not just "forms".

关于Delphi:检测何时创建新表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11575699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com