Форум: "WinAPI";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];
ВнизКак получить хэндел едита чужого окна? Найти похожие ветки
← →
Виктор (2003-08-04 21:08) [0]Не подскажите как получить хэндэл едита или енопки другого окна.
А желательно и его имя(тип как в делфи Name у объекта) и если есть кэпшен. Может есть у кого экзэмпл??? Плииииззз
← →
Rouse_ (2003-08-04 21:18) [1]
////////////////////////////////////////////////////////////////////////////////
//
// Стартовая функция, запускаем рекуссию используя хэндл рабочего стола
//
procedure TMainForm.FormCreate(Sender: TObject);
var
StartHandle : THandle;
begin
//Если требуется найти только данные по одному приложению
//замени 2 строки в функциях их закоментированными аналогами
StartHandle := GetDeskTopWindow;
//StartHandle := 67324;//FindWindow(PChar(Caption), nil); //На примере Винампа
Sys_Windows_Tree(nil, StartHandle);
end;
////////////////////////////////////////////////////////////////////////////////
//
// Рекурсивная функция, строит дерево всех открытых окон, кнопок, едитов и т.д.
// В качестве входных данных получает узел дерева и Хэндл окна
//
procedure TMainForm.Sys_Windows_Tree(Node: TTreeNode; Handle: HWND);
const
MAX = 128;
var
TmpArray : array[0..MAX - 1] of Char;
Result : String;
begin
//Запускаем цикл пока не закончатся окна
while Handle <> 0 do
begin
//Получаем имя класса окна
GetClassName(Handle, @TmpArray, MAX);
Result := String(TmpArray);
//Получаем текст (Его Caption) окна
GetWindowText(Handle, @TmpArray, MAX);
Result := Result + "(" + String(TmpArray) +
"): Handle = "+ IntToStr(Handle);
//В следующей процедуре, в скобках, добавляем результат
//в дерево, получаем хэндл дочернего окна и с результатами
//выполнения этих двух функций выполняем процедуру Sys_Windows_Tree
Sys_Windows_Tree(TreeView1.Items.AddChild(Node, Result),
GetWindow(Handle, GW_CHILD));
//Получаем хэндл следующего (не дочернего) окна
( Handle, GW_HWNDNEXT)
////////////////////////////////////////////////////////////////////////////////
//
// Стартовая функция, запускаем рекуссию используя хэндл рабочего стола
//
procedure TMainForm.FormCreate(Sender: TObject);
var
StartHandle : THandle;
begin
//Если требуется найти только данные по одному приложению
//замени 2 строки в функциях их закоментированными аналогами
StartHandle := GetDeskTopWindow;
//StartHandle := 67324;//FindWindow(PChar(Caption), nil); //На примере Винампа
Sys_Windows_Tree(nil, StartHandle);
end;
////////////////////////////////////////////////////////////////////////////////
//
// Рекурсивная функция, строит дерево всех открытых окон, кнопок, едитов и т.д.
// В качестве входных данных получает узел дерева и Хэндл окна
//
procedure TMainForm.Sys_Windows_Tree(Node: TTreeNode; Handle: HWND);
const
MAX = 128;
var
TmpArray : array[0..MAX - 1] of Char;
Result : String;
begin
//Запускаем цикл пока не закончатся окна
while Handle <> 0 do
begin
//Получаем имя класса окна
GetClassName(Handle, @TmpArray, MAX);
Result := String(TmpArray);
//Получаем текст (Его Caption) окна
GetWindowText(Handle, @TmpArray, MAX);
Result := Result + "(" + String(TmpArray) +
"): Handle = "+ IntToStr(Handle);
//В следующей процедуре, в скобках, добавляем результат
//в дерево, получаем хэндл дочернего окна и с результатами
//выполнения этих двух функций выполняем процедуру Sys_Windows_Tree
Sys_Windows_Tree(TreeView1.Items.AddChild(Node, Result),
GetWindow(Handle, GW_CHILD));
//Получаем хэндл следующего (не дочернего) окна
Handle := GetNextWindow(Handle, GW_HWNDNEXT);
//Handle := 0;
end;
end;
Желаю успехов
← →
Виктор (2003-08-04 22:22) [2]Спасибо за сорс. Но тут такой вопрос:
Тест и заголовок(Caption) это же разные вещи. Если для кнопки всё будет хорошо, то для едита - неуверен.
И если можно сорс чуть проще типа:
есть хэндэл окна, есть координаты мыши. Надо вычислить "текст" объекта под мышью. Если кнопка её кэпшэн, едит - его текст, комбобокс или т.п. тоже его текст а-ля button.caption edit.text combobox.text
Прбовал получать хэндэл объекта через GetWindow, но у всех кнопок мне писался один и тот же хэндел :(
Попробовал WindowForPoint - хэндэлы ввроде разные, но в ответ на GetWindowText - пустая строка и никаких ошибок.
Кто-нибудь может чего-нить посоветовать?
← →
Guerrillero (2003-08-05 10:54) [3]GetWindowText не работает для окон в чужих процессах, поэтому надо использовать WM_GETTEXT
По поводу текста и заголовка смотрим справку:
For an edit control, the text to be copied is the content of the edit control. For a combo box, the text is the content of the edit control (or static-text) portion of the combo box. For a button, the text is the button name. For other windows, the text is the window title. To copy the text of an item in a list box, an application can use the LB_GETTEXT message.
← →
Виктор (2003-08-05 21:22) [4]а как этот WM_GETTEXT использовать? У него в параметрах только размер буфера да буфер. А, например, хэндэл окна или какое другое укакзание на объект куда засунуть? Я так пологаю это надо виндовс мессаг послать. А вот как это делается? Может кто-нить сможет экзампловую строку вписать с использованием WM_GETTEXT
← →
Guerrillero (2003-08-05 23:53) [5]Во-первых, поиском не судьба воспользоваться
Во-вторых, посылать надо не Windows, а окну(текст, которого хотим получить)
В-третьих,вот небольшой пример:
var
H: THandle;
Buf: array[0..255] of Char;
begin
H := FindWindow("NotePad",nil);
if H = 0 then Exit;
H := FindWindowEx(H,0,"edit",nil);
if H = 0 then Exit;
SendMessage(H,WM_GETTEXT,256,Integer(@Buf));
Caption := String(Buf);
Для проверки открой блокнот и введи текст
Этот же текст должен отобразиться в заголовке формы
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c