Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.10.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.006 c
2-1221014088
Sw
2008-09-10 06:34
2008.10.19
Создание и уничтожение объекта


1-1200888950
VladSel
2008-01-21 07:15
2008.10.19
Размер выделенной памяти для массива


2-1220964901
dmitry_12_08_73
2008-09-09 16:55
2008.10.19
После закрытия всех форм программа не пропадает в таскбаре


1-1200507999
@!!ex
2008-01-16 21:26
2008.10.19
Включение, отключение второго моника


15-1219920689
Tricky
2008-08-28 14:51
2008.10.19
Todo List не работает в D7





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский