Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.19;
Скачать: CL | DM;

Вниз

Определение дескриптора окна под текущим окном   Найти похожие ветки 

 
dmitry_12_08_73 ©   (2008-09-10 13:24) [0]

Не понятно, как определить дескриптор окна, которое находится под текущим окном. Текущее окно определяю так:
GetCursorPos(pt)
h := WindowFromPoint(pt)
В моём случае текущее окно - это форма моего приложения, а окно, дескриптор которого надо определить - это окно, находящееся на рабочем столе


 
Anatoly Podgoretsky ©   (2008-09-10 13:27) [1]

> dmitry_12_08_73  (10.09.2008 13:24:00)  [0]

Под текущим окном может находиться множество окон, а не одно.


 
clickmaker ©   (2008-09-10 13:35) [2]

GetNextWindow, пока не наткнулись на искомое


 
dmitry_12_08_73 ©   (2008-09-10 13:39) [3]

Нужен дескриптор окна, которое видимо для текущей позиции указателя мыши


 
Германн ©   (2008-09-10 13:42) [4]

Судя по http://delphimaster.net/view/2-1220964901/
опять что-то делается перанально.


 
oldman ©   (2008-09-10 13:43) [5]


> dmitry_12_08_73 ©   (10.09.08 13:39) [3]
> Нужен дескриптор окна, которое видимо


А система откуда это знает?
Если под твоих окном находится два взаимноперекрывающихся окна, откуда системе знать, какое было активным последнее?


 
dmitry_12_08_73 ©   (2008-09-10 13:56) [6]

Для текущего курсора мыши видно только одно окно или его часть - вот для этого окна и надо определить дескриптор. Форму своего приложения я не считаю - мне надо определить дескриптор окна под этой формой.


 
Юрий Зотов ©   (2008-09-10 14:04) [7]

WindowFromPoint?


 
dmitry_12_08_73 ©   (2008-09-10 14:13) [8]

В моём случае WindowFromPoint возвращает дескриптор моей формы, а мне надо дескриптор окна, находящегося под ней


 
Anatoly Podgoretsky ©   (2008-09-10 14:17) [9]

> dmitry_12_08_73  (10.09.2008 13:56:06)  [6]

WindowFromPoint


 
Anatoly Podgoretsky ©   (2008-09-10 14:20) [10]

> dmitry_12_08_73  (10.09.2008 14:13:08)  [8]

А ты снача убери свое окно с этой точки.


 
dmitry_12_08_73 ©   (2008-09-10 14:23) [11]

Ещё раз. У меня курсор мыши находится над моей формой, а надо получить handle окна, которое находится под ней, как будто моей формы нет. WindowFromPoint возвращает handle моей формы - это мне не подходит.


 
Юрий Зотов ©   (2008-09-10 14:26) [12]

GetWindow c GW_HWNDNEXT?


 
Юрий Зотов ©   (2008-09-10 14:29) [13]

Видимо, действительно нужен цикл. Идем от формы по Z-порядку, для каждого окна получаем его Rect и проверям PtInRect.


 
dmitry_12_08_73 ©   (2008-09-10 14:54) [14]

Спасибо, Юрий, буду пробовать


 
Юрий Зотов ©   (2008-09-10 15:00) [15]

Цикл нужен потому, что под формой могут находиться несколько неперекрывающихся окон и то из них, которое "под курсором" не обязательно идет сразу за формой в Z-порядке.


 
dmitry_12_08_73 ©   (2008-09-10 15:52) [16]

Извиняюсь, но не получается организовать цикл, может подскажите как?


 
Amoeba ©   (2008-09-10 15:57) [17]

Читать это:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=432


 
Юрий Зотов ©   (2008-09-10 16:28) [18]

Код написан "навскидку", возможны ошибки.

function TForm1.GetUnderlayingWindow: HWND;
var
 P: TPoint;
 R: TRect;
begin
 GetCursorPos(P);
 Result := GetNextWindow(Handle, GW_HWNDNEXT);
 while Result <> 0 do
 begin
   GetWindowRect(Result, R);
   if PtInRect(P, R) then
     Exit;
   Result := GetNextWindow(Result, GW_HWNDNEXT);
 end;
end;


 
dmitry_12_08_73 ©   (2008-09-10 16:50) [19]

Вы знаете, я тоже писал подобное по вашему совету, но в результате получаем handle текущего на данный момент под курсором окна, которое не обязательно видимо. А мне надо handle только видимого в данной точке окна.


 
{RASkov} ©   (2008-09-10 17:00) [20]

Попробуй так:
procedure TForm1.FormClick(Sender: TObject);
var H: HWND; R: TRect; P: TPoint;
begin
 H:=Application.Handle;
 GetCursorPos(P);
 repeat
  H:=GetNextWindow(H, GW_HWNDNEXT);
  if not IsWindowVisible(H) then Continue;
  GetWindowRect(H, R);
 until (H=0) or (PtInRect(R, P));
 SetForegroundWindow(H);
end;


 
{RASkov} ©   (2008-09-10 17:01) [21]

> SetForegroundWindow(H);

Думаю догадался, что это просто для проверки :)


 
dmitry_12_08_73 ©   (2008-09-10 18:09) [22]

Функция IsWindowVisible позволяет определить видимо или нет окно в целом, а мне надо определить видимость окна ИМЕННО в заданной точке рабочего стола


 
Юрий Зотов ©   (2008-09-10 18:28) [23]

Люди, кто-нибудь что-нибудь понимает?


 
dmitry_12_08_73 ©   (2008-09-10 18:36) [24]

Можно я поясню из-за чего весь сыр-бор.
Я копирую образ экрана на форму в своём приложении, а затем мне надо выделять своими рамками окна, которые находятся на рабочем столе.  Так как форма переднего плана - это моя форма, я не могу определить handle окон, которые находятся под моей формой. handle мне надо для дальнейшего выделения текущего под курсором окна рамкой.


 
{RASkov} ©   (2008-09-10 19:45) [25]

> [24] dmitry_12_08_73 ©   (10.09.08 18:36)

А чем не устраивают ответы выше?
Если честно, то я присоединяюсь к [23], даже после пояснения всего сыра-бора....


 
{RASkov} ©   (2008-09-10 20:26) [26]

Оно:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
   procedure FormClick(Sender: TObject);
 private
   { Private declarations }
 public
   B: TBitMap;
   OldHnwd: HWND;
   { Public declarations }
 end;

var Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var DC: HDC;
begin
 BorderStyle:=bsNone;
 WindowState:=wsMaximized;
 DoubleBuffered:=True;
 B:=TBitMap.Create;
 B.Width:=Screen.Width;
 B.Height:=Screen.Height;
 DC:=GetDC(0);
 BitBlt(B.Canvas.Handle, 0, 0, B.Width, B.Height, DC, 0, 0, SRCCOPY);
 ReleaseDC(0, DC);
 Canvas.Brush.Style:=bsClear;
 OldHnwd:=0;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var H: HWND; R: TRect; P: TPoint;
begin
 H:=Application.Handle;
 GetCursorPos(P);
 repeat
  H:=GetNextWindow(H, GW_HWNDNEXT);
  if not IsWindowVisible(H) then Continue;
  GetWindowRect(H, R);
 until (H=0) or (PtInRect(R, P));
 if OldHnwd=H then Exit else OldHnwd:=H;
 with Canvas do begin
  Draw(0, 0, B);
  Pen.Width:=3;
  Pen.Color:=clRed;
  Rectangle(R);
 end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
 SetForegroundWindow(OldHnwd);
 Close;
end;

end.

? На коленке писано... :)


 
{RASkov} ©   (2008-09-10 20:30) [27]

Желательно, перед запуском "проги" из [26], несколько калькуляторов запустить, для пущего эффекта)


 
dmitry_12_08_73 ©   (2008-09-11 11:00) [28]

Спасибо, я разобрался, помогло.
Но функция GetNextWindow ищет не все окна. Например не находит элементы внутри окна такие как кнопки, т.е. которые тоже имеют свой handle.


 
Юрий Зотов ©   (2008-09-11 13:56) [29]

> dmitry_12_08_73 ©   (11.09.08 11:00) [28]

Такие окна называются дочерними и GetNextWindow их действительно не ищет. И не должна, потому что об этом прямо сказано в документации (которую, кстати, неплохо было бы все же посмотреть).

Для поиска дочерних окон можно использовать GetWindow, GetChildWindow, FindWindowEx, EnumChildWindows.



Страницы: 1 вся ветка

Текущий архив: 2008.10.19;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.012 c
2-1221127435
mefodiy
2008-09-11 14:03
2008.10.19
Черно-белая печать на цветном принтере


15-1219816392
Vlad Oshin
2008-08-27 09:53
2008.10.19
Поделитесь красивыми/неожиданными решениями с виду сложных задач?


2-1221131062
programmer90
2008-09-11 15:04
2008.10.19
Команда в ShellExecute


1-1200667886
Adm
2008-01-18 17:51
2008.10.19
Потоки команд


2-1218701003
Нов_и_чок
2008-08-14 12:03
2008.10.19
преобразование длинных имен файлов Windows в DOS