Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Разработка Windows Forms > Управление чужим приложением через Spy++ |
Автор: zmaximka 27.5.2006, 22:59 |
Ребята, нужно написать прогу которая делала манипуляции с другой прогой! В инете порылся, нашел что это делается через Spy++. Только как это сделать через С# пока представления не имею. Объясните пожалуйста, кто имел опыт работы или укажите ссылочку на данную тематика! |
Автор: mr.DUDA 28.5.2006, 15:10 |
Spy++ это утилита, входящая в комплект VS начиная с 6-й версии. Предназначение её состоит в том, чтобы иметь возможность посмотреть на иерархию процессов, потоков и окон. Кроме того, можно трассировать WinAPI-шные сообщения с возможностью фильтрации, а также найти окно по Handle и наоборот. Вот практически всё что она умеет. |
Автор: zmaximka 28.5.2006, 23:33 |
В MFC она помогала отлавливать сообщения других програм! Я вообще, если честно еще не достаточно опытем и так и не смог найти решения этой задачи! Т.е. как нажимать кнопку чужой программы из своей. Может есть какое-то другое решение? |
Автор: zmaximka 29.5.2006, 12:59 | ||
А можно привести пример на С#, пожалуйста! |
Автор: mr.DUDA 29.5.2006, 13:02 |
Пример для какого приложения тебе нужен ? Или так, в общем ? |
Автор: zmaximka 29.5.2006, 14:20 |
Ну к примеру, что б я нажимал в своем приложении кнопку, а в стандартном виндовом калькуляторе нажималась цифра 1. |
Автор: mr.DUDA 30.5.2006, 08:46 | ||||
Вот пример, консольное приложение, при запуске находит окно калькулятора и "нажимает" в нём кнопку 1:
|
Автор: zmaximka 31.5.2006, 15:22 | ||
Вах, Шайтан!!! Спасибо! |
Автор: VisualProgrammerNET 31.5.2006, 16:51 |
Давно мучал вопрос. Как из приложения C# выключить/перезагрузить комп? Ессно, через винапи, но сколько ни лазил по библиотекам... в общем, как? ![]() Собрался написать хитрую программку, которая прячется в автозапуске и при активизации перезагружает комп ![]() ![]() |
Автор: mr.DUDA 31.5.2006, 20:40 | ||
один топик = один вопрос, вообще-то... Что касается "как выключить комп", то это делается через командную строку: RUNDLL.EXE user.exe,exitwindows Можно то же самое через WinExec организовать, или через Process.Start() |
Автор: zmaximka 8.6.2006, 14:03 |
А почему кнопка может не ловится Spy++? Я навожу на нее прицел, а виделяется только один GroupBox |
Автор: mr.DUDA 14.6.2006, 10:58 | ||
Может, и не кнопка это вовсе ![]() Руками нарисованная, то есть. З.Ы. проверить просто: находишь прицелом групбокс и в дереве смотришь, какие у групбокса внутри есть чилды. Если там кнопки нету - значит её и нет. З.Ы.(2) извиняюсь за задержку с ответом. |
Автор: zmaximka 23.6.2006, 15:57 | ||
Таки нет! И как же все таки можно ее нажать? |
Автор: jfx 23.6.2006, 16:07 | ||
Думаю вам небезинтересно будет прочесть вот эту статью: Deliver The Power Of Spy++ To Windows Forms With Our New Tool
http://msdn.microsoft.com/msdnmag/issues/06/04/ManagedSpy/ |
Автор: mr.DUDA 23.6.2006, 16:11 |
По простому не получается ? Ну попробуй тогда сделать так, если сможешь: 1) начать с пом. Spy++ прослушивать сообщения WM_LBUTTONDOWN/UP/CLICK, выставить галку "All windows of same process" 2) нажать мышкой "кнопку" в окне 3) посмотреть, какие сообщения отловил Spy++ 4) не меняя положения окна с "кнопкой", послать (с пом. SendMessage) окну такие же сообщения с теми же lParam и wParam, посмотреть будет ли результат Если пункт 4 приведёт к такой же реакции, как пункт 2 (т.е. "кнопка" нажмётся), значит можно всё это делать для любого положения окна: после того как FindWindow() нашёл окно, определяем левый верхний угол окна (импортируемая функция GetWindowPos), по ним вычисляем координаты кнопки и посылаем окну WM_LBUTTONDOWN/WM_LBUTTONUP. Добавлено @ 16:14 Упс, пропустил сообщение jfx, скорее всего в этом и дело ![]() |
Автор: zmaximka 26.6.2006, 17:28 |
А у меня выдает ошибку! Подозреваю что lParam у меня в такой форме 0014000E, а у тебя в 0x150018! Если да, то как переконвертировать? |
Автор: mr.DUDA 26.6.2006, 17:38 |
Это такое же hex-число, как и 0x150018. Только "0x" не хватает. |
Автор: zmaximka 26.6.2006, 17:44 |
А можно пример?! ![]() |
Автор: mr.DUDA 26.6.2006, 18:22 |
Пример чего ? Шестнадцатеричных чисел ? Пожалста: 0x000001 0xabcdef 0x456000 0x100000 |
Автор: zmaximka 26.6.2006, 18:46 | ||
Не работает! Я посылаю этой нарисованной кнопке сообщения, а она не реагирует! Может я не тому окну посылаю?
|
Автор: mr.DUDA 27.6.2006, 10:42 |
Так ты посылаешь сообщение кнопке скроллбара ? Для этого есть совсем другие сообщения - WM_VSCROLL, например. |
Автор: zmaximka 27.6.2006, 15:12 |
Нет, я нечиго на хочу прокручивать! Я вообще не могу понять откуда там скрол бар, если его там нет. |
Автор: zmaximka 27.6.2006, 16:02 | ||
Все!!! Эта кнопка нажимается. А если кнопка на панеле задач то же LBUTONNUP LBUTONNDOWN? |
Автор: zmaximka 3.7.2006, 10:57 |
А если кнопка на панеле задач то же LBUTONNUP LBUTONNDOWN? |
Автор: mr.DUDA 3.7.2006, 11:08 |
Панель задач - отдельное окно, но в целом ничем (по поведению) не должно отличаться от обычных окон. |
Автор: zmaximka 3.7.2006, 11:15 | ||
И панель инструментов тоже? |
Автор: mr.DUDA 3.7.2006, 13:13 |
ну и при чём здесь панель инструментов к панели задач ?.. |
Автор: zmaximka 3.7.2006, 14:15 |
А если кнопка на панеле инструментов, то же LBUTONNUP LBUTONNDOWN? |
Автор: mr.DUDA 3.7.2006, 21:48 |
Гм, что понимается под "панелью инструментов" ? Область окна в верхней части, где расположены мелкие кнопки типа "открыть файл", "копировать", "вставить" и т.п. ? Если да - то там кроме WM_LBUTTONDOWN/UP/CLICK есть ещё очень важное сообщение WM_COMMAND, посылаемое при выборе (нажатии/отжатии) кнопки тулбара. Можно в эту сторону покопать... |
Автор: Ch0bits 3.7.2006, 22:41 |
Есть такая архиполезная утилита %systemroot%\system32\shutdown.exe -r -t 60 запускаешь и смотришь на табличку о завершении работы (такую же вызывал MSBlast) ![]() Подробнее читай справку - ключ /? Отмена завершения - ключ -a. |
Автор: mr.DUDA 3.7.2006, 23:33 | ||
всё это классно, конечно, но непонятно как относится к теме |
Автор: zmaximka 5.7.2006, 21:49 |
А какое посылать сообщение для нажатия OK/Cancel в сплывающем сообщении? |
Автор: mr.DUDA 6.7.2006, 00:57 |
Энтер и искейп |
Автор: zmaximka 6.7.2006, 12:05 |
А пример можлно? ![]() |
Автор: Nickey 26.5.2007, 22:08 |
Понятно что один вопрос - одна тема, но мой вопросец очень схож. Как нажать на кнопку другого прилажения из вышеприведенных примеров понятно, а вот если на форме есть объект для ввода текста, как туда послать сообщение. Интересует меня потомучто есть задача в телнет клиент кинуть пару команд, т.е. саму команду, и enter. Вот как это можно сделать? |
Автор: mr.DUDA 27.5.2007, 15:57 |
Nickey, читайте разделы в MSDN посвещённые оконным сообщениям и в частности - функции SendMessage, PostMessage. Для замены текста в тектбоксе на новый - сообщение WM_SETTEXT. Для добавления текста придётся эмулировать нажатия клавиш (для этого есть стандартный класс SendKeys). |