powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как проверить, что окно не перекрыто другими окнами?
3 сообщений из 3, страница 1 из 1
Как проверить, что окно не перекрыто другими окнами?
    #39625534
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос не про TopMost активное окно, а именно про перекрытие чужими окнами всего или части своего окна?

Наведите плиз на мысль.
...
Рейтинг: 0 / 0
Как проверить, что окно не перекрыто другими окнами?
    #39625542
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_Вопрос не про TopMost активное окно, а именно про перекрытие чужими окнами всего или части своего окна?

Наведите плиз на мысль.

В свое время пытался так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TfMain = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    procedure DisplayVisiblePortion();
    function CalcVisiblePortion() : Integer;
  end;

var
  fMain: TfMain;

implementation

{$R *.DFM}

function RectSquare (const Rect : TRect) : Integer;
begin
  with Rect do
    Result := (Right - Left) * (Bottom - Top);
  if Result < 0 then
    Result := - Result;
end;

type
  TRectArray = array[0..16384] of TRect;
  PRectArray = ^TRectArray;

function RgnSquare (Rgn : HRGN) : Integer;
var
  DataSize : DWORD;
  RgnData : PRGNDATA;
  Rectangles : PRectArray;
  I : Integer;
begin
  Result := 0;
  DataSize := GetRegionData(Rgn, 0, nil);
  if DataSize > 0 then begin
    GetMem(RgnData, DataSize);
    try
      GetRegionData(Rgn, DataSize, RgnData);
      Rectangles := PRectArray(@RgnData.Buffer);
      for I:=0 to Pred(RgnData^.rdh.nCount) do
        Inc(Result, RectSquare(Rectangles^[I]));
    finally
      FreeMem(RgnData, DataSize);
    end;
  end;
end;

function CalcSquarePortion (SquareWhole, SquarePart : Integer) : Integer;
begin
  if SquarePart >= SquareWhole then
    Result := 100
  else
    Result := Trunc((SquarePart / SquareWhole) * 100);
end;

function TfMain.CalcVisiblePortion: Integer;
var
  SiblingRect : TRect;
  Workarea : TRect;
  WinRect : TRect;
  Tmp : TRect;
  VisiblePortion : TRect;
  Sibling : HWND;
  WindowSquare : Integer;
  WindowRgn, Rgn, TmpRgn : HRGN;
begin
  if IsIconic(Handle) then begin
    Result := 0;
    Exit;
  end;
  Rgn := CreateRectRgn (0, 0, 0, 0);
  try
    SystemParametersInfo(SPI_GETWORKAREA, 0, @Workarea, 0);
    GetWindowRect(Handle, WinRect);
    WindowSquare := RectSquare(WinRect);
    IntersectRect(VisiblePortion, WinRect, WorkArea);
    Result := CalcSquarePortion(WindowSquare, RectSquare(VisiblePortion));
    if Result > 0 then begin
      WindowRgn := CreateRectRgnIndirect(VisiblePortion);
      try
        Sibling := GetWindow(Handle, GW_HWNDPREV);
        while (Sibling <> 0) and (Result > 0) do begin
          if IsWindowVisible(Sibling) and not IsIconic(Sibling) then
            if IsZoomed(Sibling) then begin
              Result := 0;
              Break;
            end else begin
              GetWindowRect(Sibling, SiblingRect);
              IntersectRect(Tmp, VisiblePortion, SiblingRect);
              if not IsRectEmpty(Tmp) then begin
                TmpRgn := CreateRectRgnIndirect(Tmp);
                try
                  if CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR) = ERROR then
                    RaiseLastWin32Error();
                finally
                  DeleteObject(TmpRgn);
                end;
              end;
              TmpRgn := CreateRectRgn(0, 0, 0, 0);
              if CombineRgn(TmpRgn, WindowRgn, Rgn, RGN_DIFF) = ERROR then
                RaiseLastWin32Error();
              Result := CalcSquarePortion(WindowSquare, RgnSquare(TmpRgn));
              DeleteObject(TmpRgn);
            end;
          Sibling := GetWindow(Sibling, GW_HWNDPREV);
        end;
      finally
        DeleteObject(WindowRgn);
      end;
    end;
  finally
    DeleteObject(Rgn);
  end;
end;

procedure TfMain.DisplayVisiblePortion;
begin
  Caption := Format ('%d%% percents visible', [CalcVisiblePortion()]);
end;

procedure TfMain.Timer1Timer(Sender: TObject);
begin
  DisplayVisiblePortion();
end;

end.
...
Рейтинг: 0 / 0
Как проверить, что окно не перекрыто другими окнами?
    #39625560
Сергей N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Навскидку, последовательность для всех верхних окон через GetNextWindow с флагом GW_HWNDPREV, для каждого из них вычислить пересечение ограничивающего прямоугольника (каждый из которых можно определить через GetWindowRect) с границами своего окна (например, IntersectRect <> 0).
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как проверить, что окно не перекрыто другими окнами?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]