Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.009 c
14-27634
Vik_mix
2003-09-23 11:03
2003.10.09
I(max) in COM-port


3-27340
Denizzz
2003-09-20 07:50
2003.10.09
Работа с Excel


8-27619
AlexT1000
2003-06-06 13:03
2003.10.09
Как удалить речь из песни?


3-27316
viktor
2003-09-15 19:32
2003.10.09
Удаление записи в справочнике


3-27304
alexmc
2003-09-12 09:23
2003.10.09
except для несуществующей таблице





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