Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] *Решено* | *Delphi* | Работа с чужими окнами

Ответить
Настройки темы
Delphi - [решено] *Решено* | *Delphi* | Работа с чужими окнами

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Доброе время суток знатоки Делфи.

Как записать значение переменной (String, Integer, etc)
в поле ввода данных, НО другой программы (чужого окна) если известен ХЕНДЛ (который найден с помощью FindWindow)?

Пишу на Делфи 6-й версии.

Заранее спасибо за ответ.

Отправлено: 19:45, 28-10-2005

 

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Admiral
Если поле ввода данных - это объект класса TEdit,то,к примеру,для начала можно сделать так:
Код: Выделить весь код
var
 SearchedWnd : HWND;
 EDITCtrl : HWND;
begin
 SearchedWnd := FindWindow(nil, 'Заголовок искомого окна');
 EDITCtrl := FindWindowEx(SearchedWnd, 0, 'EDIT', nil);
end;
...тут мы пытаемся найти дескриптор(хендл) нужного нам поля ввода данных.
Последний параметр функции FindWindowEx - это имя искомого элемента.У меня он указан как nil,т.к. я не думаю,что имя этого элемента будет известно.Следовательно может возникнуть затруднительная ситуация,если на искомом окне будет расположено несколько подобных объектов класса TEdit...
Ну,и,в конце концов,устанавливаем в окне(поле ввода данных) свой текст:
Код: Выделить весь код
 SendMessage(EDITCtrl, WM_SETTEXT, 0, lParam('Наш текст,который мы хотим вставить в поле ввода данных'));
Подходит такой вариант?

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 13:01, 29-10-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Спасибо за ответ DillerInc.
Цитата:
Код:
SendMessage(EDITCtrl, WM_SETTEXT, 0, lParam('Наш текст,который мы хотим вставить в поле ввода данных'));
Подходит такой вариант?
Код немного не верен (судя из ругательств Делфи и хелпа) второй параметр это сообщение, а вот 3 и 4 уже Nil.
Но даже так требуется второй параметр типа Cardinal, а это продлённый (в положительную область) всё тот же Integer. Эта функцию посылает СИСТЕМНЫЕ команды, а не какой то текст, что программист захотел.

DillerInc, а у тебя удавалось в чужое окно программы отправить сообщение (ну или хотя бы символ что ли)?

Отправлено: 18:13, 03-11-2005 | #3


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Admiral
Цитата:
Код немного не верен
...если ты про функцию SendMessage,то,по-моему,ты мне мозги пудришь .
Посмотри на MSDN(я указал тебе ссылку).
Цитата:
а у тебя удавалось в чужое окно программы отправить сообщение (ну или хотя бы символ что ли)?
...если хочешь я могу запросто привести код,который меняет заголовок чужого окна.

P.S. Да,кстати,что Delphi то пишет?

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 19:39, 03-11-2005 | #4


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Алгоритм
Есть поле ввода пароля. Я из файла словаря вытаскиваю по слову и отправляю туда и жму ЕНТЕР и всё это программно.


К чему это?
А подбираю я пароли к mcd файлу. Это файл от мат пакета МатКад. http://www.mathsoft.com/

Немного не традиционный способ подбора пароля (умные люди посоветовали бы искать пароль в самом mcd посредством HEX кодов).
Или мож кто знает где эту прогу скачать (а она точно существует как и другие проги которые подбирают пароли к архивам, Ворд файлам и прочие).

Спасибо за внимание.

Последний раз редактировалось Admiral, 04-11-2005 в 00:52.


Отправлено: 20:41, 03-11-2005 | #5


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


DillerInc
Я проверел подробно почему сообщения не идут.
EDITCtrl := FindWindowEx(SearchedWnd, 0, 'EDIT', nil);
Не находит поля ввода.

А переименовать окно ето просто
SetWindowText(SearchedWnd, 'Новое название')
Для етого даже SendMessage не надо использовать.

P.S
Окно само находит и делает его активным SetForegroundWindow(SearchedWnd);
но строку ввода не находит, EDITCtrl
а по пустому хендлу много не отправиш SendMessage(EDITCtrl, WM_SETTEXT, 0, lParam('Текст');
Есть какието соображения.

Отправлено: 20:51, 06-11-2005 | #6


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Admiral
Может, посмотрите на это окошко каким-нибудь Microsoft Spy++ (из комплекта visual studio)? Там ведь все хендлы дочерний контролов видно, ЕМНИП. А значит, Вы можете их получить. Хотя бы (первым в голову приходит) по номеру, типа "второй дочерний контрол в окне"?

Отправлено: 10:12, 07-11-2005 | #7


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Admiral
Да,в самом деле эта функция FindWindowEx ничего не находит,и я не могу понять,почему...
С другой стороны,можно использовать следующий код:
Код: Выделить весь код
// CallBack-функция,используемая функцией EnumChildWindows
function ChildWndProc(h : HWND) : BOOL; stdcall;
begin
 SendMessage(h, WM_SETTEXT, 0, lParam(LPCTSTR('Текст,который надо поместить')));
 Result := True;
end;

var
 SearchedWnd : HWND;
begin
 SearchedWnd := FindWindow(nil, 'Заголовок искомого окна');
 EnumChildWindows(SearchedWnd, @ChildWndProc, 0);
end;
Код работает(читай: заголовки дочерних окон меняются),но изменяет абсолютно все дочерние окна окна-родителя.Нам необходимо как-то выделить то окно,которое нас конкретно интересует .

Хотя возможно,что можно сделать всё это как-то иначе и проще...

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Последний раз редактировалось DillerInc, 07-11-2005 в 17:58.


Отправлено: 17:42, 07-11-2005 | #8


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


СПАСИБО.
Выручили.

Что получилось

var
UnPro : HWND;
PassText: HWND;
OKbutton: HWND;

begin
UnPro:= FindWindow(nil, 'Unprotect Worksheet'); //Где меню с вводом пароля
PassText := FindWindowEx(UnPro, 0, 'Edit', nil); // Где само поле на этом меню

//Тут будет цикл и он будет зависеть от количества паролей
SendMessage(PassText, WM_SETTEXT, 0, lParam(LPCTSTR('НАШ ПАРОЛЬ'))); //Пихаем пароль
OKbutton :=FindWindowEx(UnPro, 0, 'Button', nil); //Ищем сокровенную OK
SendMessage(OKbutton, BM_CLICK, 0, 0); //Жмёт ОК принять пароль (кстати если пароль подойдёт то значение этой функции и будет обрабатываться как выход из цикла)
end;

Ну а если неправильно, то форма с этим алгоритмом повиснет, так как МАТКАД видал MSGBOX (Incorrect password…) который и прерывает дальнейший алгоритм (а дальше я планировал глушить этот ответ и продолжения цикла).
Что б повисания не было (вернее что б оно было кратковременным, а не бесконечным), создадим отдельную программу которая и глушит этот MSGBOX.

procedure TForm1.Timer1Timer(Sender: TObject);
var
BadPass :HWND;
begin
BadPass :=FindWindow(nil, 'Mathcad'); //Имя MSGBOX – Mathcad. Находим это табло
SendMessage(BadPass, WM_SYSCOMMAND, SC_CLOSE, 0); //Просим его закрыться
end;

Інтервал у таймера 1000мс. Если сделать слишком маленьким, то всё начнёт дико тормозить ну, а большой интервал нагрузит и без того длинный алгоритм.

Что натолкнуло меня на мысль
hasherfrog
использования Spy++ позволило проверять себя на каждом шаге программирования.

DillerInc
в твоём ответе за 14:01, 29-10-2005 было уже всё, искать Едит надо было в окне не самой проги, а в окне, где сам Едит находится (Spy++ указал на это). Кстати мне повезло что кнопка ОК первая, и поэтому твоё предостережение, что кому именно отправится сообщения не коснулось меня(у тебя всем окнам, а у меня могло всем кнопкам; я искал хендл по Button, а (их там двое – OK Cancel см рис за 21:41, 03-11-2005 ) и Делфи выбирался хендл первого). FindWindowEx находит!

P.S
Алгоритм готов, осталось сделать перебор по словарю, и определения правильного слова – конца цикла. И переборщих готов. (Прим – но лучше найти взломщик mcd ибо эти Ding.wav от msgbox…, хотя их можно отключить через звуковую схему, но все равно ефективность алгоритма от этого не сильно выиграет ).

Отправлено: 02:07, 08-11-2005 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] *Решено* | *Delphi* | Работа с чужими окнами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Delphi - Работа с 3D-графикой в Delphi ManHack Программирование и базы данных 8 21-11-2009 19:55
Интерфейс - [решено] Vista - переключение между окнами Memories Microsoft Windows Vista 16 30-09-2008 04:55
Delphi - Работа с файлами в Delphi Interceptor Программирование и базы данных 3 01-09-2004 15:13
Delphi - Работа с хранилищем(objerpos) в delphi 7 Poma Программирование и базы данных 3 13-06-2004 01:41




 
Переход