Главная страница
    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.009 c
15-1220003252
data
2008-08-29 13:47
2008.10.19
Вопрос к знатокам оракла. Есть ли ограничение на кол-во действий


1-1200559310
Zheksik
2008-01-17 11:41
2008.10.19
Перекрашенные ячейки StringGrid_a и выделение.


2-1221226569
webpauk
2008-09-12 17:36
2008.10.19
PanelResize


1-1200714304
Архип
2008-01-19 06:45
2008.10.19
Выборка


1-1200772003
asdqwer
2008-01-19 22:46
2008.10.19
Усовершенствованный RichEdit с возможностью выделения набор ячеек





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский