|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] *Решено* | *Delphi* | Работа с чужими окнами |
|
Delphi - [решено] *Решено* | *Delphi* | Работа с чужими окнами
|
Ветеран Сообщения: 3320 |
Профиль | Отправить PM | Цитировать Доброе время суток знатоки Делфи.
Как записать значение переменной (String, Integer, etc) в поле ввода данных, НО другой программы (чужого окна) если известен ХЕНДЛ (который найден с помощью FindWindow)? Пишу на Делфи 6-й версии. Заранее спасибо за ответ. |
|
Отправлено: 19:45, 28-10-2005 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Admiral
Если поле ввода данных - это объект класса TEdit,то,к примеру,для начала можно сделать так: var SearchedWnd : HWND; EDITCtrl : HWND; begin SearchedWnd := FindWindow(nil, 'Заголовок искомого окна'); EDITCtrl := FindWindowEx(SearchedWnd, 0, 'EDIT', nil); end; Последний параметр функции FindWindowEx - это имя искомого элемента.У меня он указан как nil,т.к. я не думаю,что имя этого элемента будет известно.Следовательно может возникнуть затруднительная ситуация,если на искомом окне будет расположено несколько подобных объектов класса TEdit... Ну,и,в конце концов,устанавливаем в окне(поле ввода данных) свой текст: Подходит такой вариант? |
------- Отправлено: 13:01, 29-10-2005 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Спасибо за ответ DillerInc.
Цитата:
Но даже так требуется второй параметр типа Cardinal, а это продлённый (в положительную область) всё тот же Integer. Эта функцию посылает СИСТЕМНЫЕ команды, а не какой то текст, что программист захотел. DillerInc, а у тебя удавалось в чужое окно программы отправить сообщение (ну или хотя бы символ что ли)? |
|
Отправлено: 18:13, 03-11-2005 | #3 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Admiral
Цитата:
Посмотри на MSDN(я указал тебе ссылку). Цитата:
P.S. Да,кстати,что Delphi то пишет? |
||
------- Отправлено: 19:39, 03-11-2005 | #4 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Алгоритм
Есть поле ввода пароля. Я из файла словаря вытаскиваю по слову и отправляю туда и жму ЕНТЕР и всё это программно. К чему это? А подбираю я пароли к mcd файлу. Это файл от мат пакета МатКад. http://www.mathsoft.com/ Немного не традиционный способ подбора пароля (умные люди посоветовали бы искать пароль в самом mcd посредством HEX кодов). Или мож кто знает где эту прогу скачать (а она точно существует как и другие проги которые подбирают пароли к архивам, Ворд файлам и прочие). Спасибо за внимание. |
|
Последний раз редактировалось Admiral, 04-11-2005 в 00:52. Отправлено: 20:41, 03-11-2005 | #5 |
Ветеран Сообщения: 3320
|
Профиль | Отправить 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 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Admiral
Может, посмотрите на это окошко каким-нибудь Microsoft Spy++ (из комплекта visual studio)? Там ведь все хендлы дочерний контролов видно, ЕМНИП. А значит, Вы можете их получить. Хотя бы (первым в голову приходит) по номеру, типа "второй дочерний контрол в окне"? |
Отправлено: 10:12, 07-11-2005 | #7 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить 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
|
Профиль | Отправить 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 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|