Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Найти формы, которые частично перекрывают окно вашего приложения

Delphi , Программа и Интерфейс , Размеры и Положение

Найти формы, которые частично перекрывают окно вашего приложения

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 

  You would have to iterate over all windows above yours in Z-order and 
  check for each window you find if it has the WS_EX_TOPMOST exstyle set 
  and is visible. 
  If it has, you have to get its window rectangle (GetWindowRect) and test 
  if that overlaps your window. 

  Example: 

}

 procedure TForm1.Button1Click(Sender: TObject);
 var
   wnd: HWND;

   function IsTopMost(wnd: HWND): Boolean;
   begin
     Result := (GetWindowLong(wnd, GWL_EXSTYLE) and WS_EX_TOPMOST) <> 0;
   end;

   procedure logWindowInfo(wnd: HWND);
   const
     visString: array[Boolean] of string = ('not ', '');
   var
     buffer: array[0..256] of Char;
     r:      TRect;
   begin
     if wnd = 0 then Exit;
     GetClassName(wnd, buffer, SizeOf(buffer));
     with Memo1.Lines do
     begin
       Add(Format(' Window of class %s ', [buffer]));
       GetWindowRect(wnd, r);
       Add(Format(' at (%d,%d):(%d,%d)', [r.Left, r.Top, r.Right, r.Bottom]));
       Add(Format(' Window is %svisible', [visString[IsWindowVisible(wnd)]]));
       Add(Format(' Window is %stopmost', [visString[IsTopmost(wnd)]]));
     end;
   end;

    begin
   Memo1.Clear;
   wnd := Handle;
   repeat
     wnd := GetNextWindow(wnd, GW_HWNDPREV);
     LogWindowInfo(wnd);
   until wnd = 0;
   Memo1.Lines.Add('End log.');
 end;

Перевод контента на русский язык:

Код, предоставленный ниже, это программный проект Delphi, который ищет окна над основной формой в порядке Z-набора и проверяет, частично ли они перекрываются с ней. Работает следующим образом:

  1. Функция IsTopMost проверяет, имеет ли окно стиль WS_EX_TOPMOST, что означает, что оно всегда будет находиться на верхнем уровне над другими окнами.
  2. Процедура logWindowInfo логгирует информацию о каждом найденном окне: его имя класса, позицию, статус видимости и является ли оно верхним или нет.
  3. В событии клика кнопки основной формы:
    • Очищается компонент memo для отображения результатов.
    • Устанавливается переменная wnd в значение handle основной формы.
    • Затем происходит итерация над всеми окнами, расположенными над основной формой в порядке Z-набора с помощью GetNextWindow с типом окна GW_HWNDPREV.
    • Для каждого окна вызывается процедура logWindowInfo, чтобы логгировать информацию о нем.
    • Цикл продолжается, пока не будет найдено больше окон (т.е., wnd = 0).
    • Наконец, добавляется сообщение "End log." в компонент memo.

Программа может быть улучшена следующими способами:

  1. Вместо использования GetNextWindow с типом окна GW_HWNDPREV, можно использовать EnumWindows и итерировать над всеми окнами в порядке Z-набора напрямую.
  2. Можно добавить больше информации о каждом окне, например, его владельца или родительское окно, если это необходимо.
  3. Если программа предназначена для отладки, можно добавить фильтр только для окон, частично перекрывающихся с основной формой.

Вот альтернативное решение с использованием EnumWindows:

procedure TForm1.Button1Click(Sender: TObject);
var
  wnd: HWND;
begin
  Memo1.Clear;
  EnumWindows(@EnumProc, 0);
  Memo1.Lines.Add('End log.');
end;

function EnumProc(hwnd: HWND; lParam: LPARAM): BOOL;
begin
  if (GetWindowLong(hwnd, GWL_EXSTYLE) and WS_EX_TOPMOST <> 0) then
    if IsWindowVisible(hwnd) then
      logWindowInfo(hwnd);
  Result := True;
end;

procedure TForm1.logWindowInfo(hwnd: HWND);
const
  visString: array[Boolean] of string = ('not ', '');
var
  buffer: array[0..256] of Char;
  r: TRect;
begin
  if hwnd = 0 then Exit;
  GetClassName(hwnd, buffer, SizeOf(buffer));
  with Memo1.Lines do
  begin
    Add(Format('Window of class %s', [buffer]));
    GetWindowRect(hwnd, r);
    Add(Format(' at (%d,%d):(%d,%d)', [r.Left, r.Top, r.Right, r.Bottom]));
    Add(Format('Window is %svisible', [visString[IsWindowVisible(hwnd)]]));
    Add(Format('Window is %stopmost', [visString[IsTopMost(hwnd)]]));
  end;
end;

В этом коде определена функция EnumProc, которая вызывается для каждого окна в порядке Z-набора. Процедура проверяет, имеет ли окно стиль WS_EX_TOPMOST, и является ли оно видимым, а затем логгирует информацию о нем с помощью процедуры logWindowInfo.

Найдите формы, которые частично перекрывают окно вашего приложения, проверив все окна выше вашего в порядке Z и определив, имеет ли каждый из них стиль WS_EX_TOPMOST и является ли он видимым.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Размеры и Положение ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:34:51/0.0039918422698975/0