# | Сообщение добавлено 11.03.2011 00:12:10
Добрый вечер, Leo08.
Я не уверен, что то, что я изложу ниже будет работать, но стоит попробовать.
Вот алгоритм действий:
1)Просматриваем все окна в системе по очереди.
2)Получив дескриптор очередного окна просматриваем его дочерние окна.
3)Получив дескриптор очередного дочернего окна, получаем его координаты.
4)Если полученные координаты савподают с Вашими, то выкачиваем из окна всю необходимую инфу.
Просмотреть все окна в системе можно при помощи процедуры EnumWindows(). Ей нужно передать два параметра:
-указатель на функцию типа function functionname(h:hwnd):BOOL; stdcall;
-здесь ставим ноль (0).
После вызова EnumWindows() функция functionname будет выполнена столько раз, сколько окон открыто в системе, причем при каждом ее вызове в параметр h будет передаваться дескриптор очередного окна.
Просмотреть дочерние окна можно при помощи процедуры с аналогичным синтаксисом enumchildwindows().
Вот кусочек кода, который выведет в memo1 дескрипторы всех форм, кнопок, edit'ов и.т.д.
Function EnumWind(h:hwnd):BOOL; stdcall;
Begin
EnumChildWindows(h,@EnumCWnd,0);
End;
Function EnumCWnd(h:hwnd):BOOL; stdcall;
Begin
Memo1.Lines.Add(IntToStr(h));
End;
Var h:THandle;
Begin
EnumWindows(@EnumWind,0);
End;
Теперь нам вместо вывода в Memo1 надо получить координаты окна. Это можно сделать через процедуру GetWindowRect(). Ей надо передать 2 параметра:
-Дескриптор окна, координаты которого определяем.
-Структура типа TRect, куда и будут записаны координаты.
Если Вы в моем исходнике замените строчку
Memo1.Lines.Add(IntToStr(h));
на строчки
GetWindowRect(h,Rect);
Memo1.Lines.Add(IntToStr(Rect.Left)+' '+IntToStr(Rect.Right));
А так же добавите переменную Rect типа TRect, то в Memo1 будут выведены координаты верхнего левого угла каждой формы, кнопки, edit'a и много чего другого.
Далее найдите искомые координаты и творите с этим окном что захотите.
Удачи.
RGStalker7@Rambler.ru
Добавлено 11.03.2011 00:31:17 (через 19 минут 7 секунд )
Есть и второй способ. Только не знаю рабочий ли он. Вот исходник:
function GetCaptionAtPoint(CrPos: TPoint): string;
var
textlength: Integer;
Text: PChar;
Handle: HWND;
begin
Result := 'Empty';
Handle := WindowFromPoint(CrPos);
if Handle = 0 then Exit;
textlength := SendMessage(Handle, WM_GETTEXTLENGTH, 0, 0);
if textlength <> 0 then
begin
getmem(Text, textlength + 1);
SendMessage(Handle, WM_GETTEXT, textlength + 1, Integer(Text));
Result := Text;
freemem(Text);
end;
end;
Теоретически он должен отображать название элемента, расположенного под курсором.
С моей точки зрения первый способ лучше.
Ахтунг! Собакирен мит зубен клац, клац! Зубен зи дойч!