//Find windows that may cover another window.
Var
hW: HWnd;
r: TRect;
begin
hw := Handle;
While IsWindow(hw) Do Begin
hw := GetWindow( hw, GW_HWNDPREV );
If IsWindowVisible(hw) and not IsIconic( hw ) Then Begin
... use GetWindowRect( hw, r ) to get candidate windows
rect and check if it intersects the forms BoundsRects via
IntersectRect
End;
End;
end;
Here's the translation of the text into Russian:
Чтобы узнать, какой из окон закрывает другое окно, вы можете использовать функцию GetWindow с флагом GW_HWNDPREV. Этот флаг возвращает.handle предыдущего окна в порядке Z-отображения.
В вашем коде вы уже используете этот подход для перебора окон, которые могут закрывать другое окно. Вы получаете handle предыдущего окна в порядке Z-отображения, вызывая GetWindow(hw, GW_HWNDPREV), и затем проверяете, является ли оно видимым и не иконкой (т. е., миниатюрным окном).
Если вы хотите узнать, которое конкретное окно закрывает вашу форму, вы можете отслеживать handle предыдущего окна (hw) и проверять его видимость и статус иконы. Если оно видимо и не является иконкой, вы можете предположить, что оно закрывает вашу форму.
Вот модифицированная версия вашего кода:
// Найдите окно, которое закрывает другое окно
Var
hW: HWnd;
r: TRect;
begin
hW := Handle; // Получите handle текущего окна (вашей формы)
While IsWindow(hW) Do Begin
hW := GetWindow(hW, GW_HWNDPREV); // Получите предыдущее окно в порядке Z-отображения
If IsWindowVisible(hW) and not IsIconic(hW) Then Begin
... используйте GetWindowRect(hW, r) для получения прямоугольника кандидатского окна
rect и проверьте, пересекается ли он с прямоугольником вашей формы BoundsRect с помощью IntersectRect
// Поскольку IntersectRect возвращает true, это означает, что предыдущее окно закрывает вашу форму
writeln('Окно, которое закрывает вашу форму, - ', hW);
End;
End;
end;
В этом модифицированном коде, когда вы находитесь в окне, которое закрывает вашу форму (т. е., IsWindowVisible(hW) and not IsIconic(hW)), вы можете записать handle этого окна в консоль с помощью writeln.
Обратите внимание, что этот код предполагает, что предыдущее окно в порядке Z-отображения является тем, которое закрывает вашу форму. Если есть несколько окон с одним и тем же порядком Z-отображения, это подход может не работать правильно.
В статье описывается способ определить, какое окно закрывает форму, используя функцию GetWindow и проверку видимости и состояния окна.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS