Модераторы: gambit, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Управление чужим приложением через Spy++, Помогите освоить 
:(
    Опции темы
zmaximka
Дата 27.5.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 27.5.2006
Где: Украина, Одесса

Репутация: нет
Всего: нет



Ребята, нужно написать прогу которая делала манипуляции с другой прогой! В инете порылся, нашел что это делается через  Spy++. Только как это сделать через С# пока представления не имею. Объясните пожалуйста, кто имел опыт работы или укажите ссылочку на данную тематика!  
PM MAIL ICQ   Вверх
mr.DUDA
Дата 28.5.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Spy++ это утилита, входящая в комплект VS начиная с 6-й версии. Предназначение её состоит в том, чтобы иметь возможность посмотреть на иерархию процессов, потоков и окон. Кроме того, можно трассировать WinAPI-шные сообщения с возможностью фильтрации, а также найти окно по Handle и наоборот. Вот практически всё что она умеет. 


--------------------
user posted image
PM MAIL WWW   Вверх
zmaximka
Дата 28.5.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 27.5.2006
Где: Украина, Одесса

Репутация: нет
Всего: нет



Цитата(mr.DUDA @  28.5.2006,  15:10 Найти цитируемый пост)
Spy++ это утилита ...

В MFC она помогала отлавливать сообщения других програм! 
Я вообще, если честно еще не достаточно опытем и так и не смог найти решения этой задачи! Т.е. как нажимать кнопку чужой программы из своей. Может есть какое-то другое решение?
 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 29.5.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(zmaximka @  28.5.2006,  22:33 Найти цитируемый пост)
В MFC она помогала отлавливать сообщения других програм! 

вот именно, поэтому первый вопрос непонятен:

Цитата(zmaximka @  27.5.2006,  21:59 Найти цитируемый пост)
нужно написать прогу которая делала манипуляции с другой прогой! В инете порылся, нашел что это делается через  Spy++.


Что касаемо собстна "нажать чужую кнопку", так это на WinAPI делается "на раз", если знать структуру чужого окна (нас интересуют имена window classes и иерархия вложенности окон). Действительно, получить эту инфу можно с пом. Spy++. На этом все возможности этой утилиты и заканчиваются, потому что посылать сообщения она не умеет. Как нажать кнопку, зная её window class и расположение в дереве окон ? Используя функцию FindWindow или FindWindowEx, получаем по имени или по window class-у "корневое" окно приложения, затем таким же образом ищем вложенное окно, пробираясь по иерархии окон. Когда добрались до кнопки, имеем её Handle (HWND), можно послать нажатие. Чтобы в точности сымитировать нажатие, можно например с помощью той же Spy++ прицепиться к кнопке и трассировать оконные сообщения с фильтрацией "только WM_LBUTTONDOWN, WM_LBUTTONUP", получив таким способом lParam и wParam. Эти значения и будут аргументами ф-ции SendMessage. 


--------------------
user posted image
PM MAIL WWW   Вверх
zmaximka
Дата 29.5.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 27.5.2006
Где: Украина, Одесса

Репутация: нет
Всего: нет



Цитата(mr.DUDA @  29.5.2006,  12:11 Найти цитируемый пост)
Когда добрались до кнопки, имеем её Handle (HWND), можно послать нажатие. Чтобы в точности сымитировать нажатие, можно например с помощью той же Spy++ прицепиться к кнопке и трассировать оконные сообщения с фильтрацией "только WM_LBUTTONDOWN, WM_LBUTTONUP", получив таким способом lParam и wParam. Эти значения и будут аргументами ф-ции SendMessage.  

А можно привести пример на С#, пожалуйста!
 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 29.5.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Пример для какого приложения тебе нужен ? Или так, в общем ? 


--------------------
user posted image
PM MAIL WWW   Вверх
zmaximka
Дата 29.5.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 27.5.2006
Где: Украина, Одесса

Репутация: нет
Всего: нет



Цитата(mr.DUDA @  29.5.2006,  13:02 Найти цитируемый пост)
Пример для какого приложения тебе нужен ? Или так, в общем ?

Ну к примеру, что б я нажимал в своем приложении кнопку, а в стандартном виндовом калькуляторе нажималась цифра 1. 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 30.5.2006, 08:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(zmaximka @  29.5.2006,  13:20 Найти цитируемый пост)
Ну к примеру, что б я нажимал в своем приложении кнопку, а в стандартном виндовом калькуляторе нажималась цифра 1. 

Вот пример, консольное приложение, при запуске находит окно калькулятора и "нажимает" в нём кнопку 1:

Код
using System;
using System.Runtime.InteropServices;

class TestProgram
{
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string windowName);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

    const int WM_LBUTTONDOWN = 0x0201;
    const int WM_LBUTTONUP = 0x0202;

    static void Main()
    {
        // находим окно калькулятора, зная window class ("SciCalc")
        IntPtr calcWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "SciCalc", null);

        // находим кнопку по имени окна ("1") и имени класса ("Button")
        IntPtr button1 = FindWindowEx(calcWnd, IntPtr.Zero, "Button", "1");

        // если нашли
        if(button1 != IntPtr.Zero)
        {
            // посылаем нажатие кнопки мыши, последний параметр
            // содержит координаты мыши (скопировано из Spy++)
            SendMessage(button1, WM_LBUTTONDOWN, 1, 0x150018);
            SendMessage(button1, WM_LBUTTONUP, 0, 0x150018);
        }
    }
}
 


--------------------
user posted image
PM MAIL WWW   Вверх
zmaximka
Дата 31.5.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 27.5.2006
Где: Украина, Одесса

Репутация: нет
Всего: нет



Цитата(mr.DUDA @  30.5.2006,  08:46 Найти цитируемый пост)
Вот пример, консольное приложение, при запуске находит окно калькулятора и "нажимает" в нём кнопку 1:

Вах, Шайтан!!! Спасибо!
 
PM MAIL ICQ   Вверх
VisualProgrammerNET
Дата 31.5.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 1
Всего: 6



Давно мучал вопрос. Как из приложения C# выключить/перезагрузить комп? Ессно, через винапи, но сколько ни лазил по библиотекам... в общем, как?  smile 

Собрался написать хитрую программку, которая прячется в автозапуске и при активизации перезагружает комп  smile . Ловушка для ламеров, обладающих .NET Framework'ом  smile  


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 31.5.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(VisualProgrammerNET @  31.5.2006,  15:51 Найти цитируемый пост)
 Как из приложения C# выключить/перезагрузить комп? Ессно, через винапи, но сколько ни лазил по библиотекам... в общем, как?

один топик = один вопрос, вообще-то...

Что касается "как выключить комп", то это делается через командную строку:

RUNDLL.EXE user.exe,exitwindows

Можно то же самое через WinExec организовать, или через Process.Start() 


--------------------
user posted image
PM MAIL WWW   Вверх
zmaximka
Дата 8.6.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 27.5.2006
Где: Украина, Одесса

Репутация: нет
Всего: нет



А почему кнопка может не ловится Spy++? Я навожу на нее прицел, а виделяется только один GroupBox 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 14.6.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(zmaximka @  8.6.2006,  13:03 Найти цитируемый пост)
А почему кнопка может не ловится Spy++? Я навожу на нее прицел, а виделяется только один GroupBox 

Может, и не кнопка это вовсе  smile
Руками нарисованная, то есть.

З.Ы. проверить просто: находишь прицелом групбокс и в дереве смотришь, какие у групбокса внутри есть чилды. Если там кнопки нету - значит её и нет.

З.Ы.(2) извиняюсь за задержку с ответом. 


--------------------
user posted image
PM MAIL WWW   Вверх
zmaximka
Дата 23.6.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 27.5.2006
Где: Украина, Одесса

Репутация: нет
Всего: нет



Цитата(mr.DUDA @  14.6.2006,  10:58 Найти цитируемый пост)
проверить просто: находишь прицелом групбокс и в дереве смотришь, какие у групбокса внутри есть чилды. Если там кнопки нету - значит её и нет.

Таки нет! И как же все таки можно ее нажать? 
PM MAIL ICQ   Вверх
jfx
Дата 23.6.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 18.10.2004

Репутация: нет
Всего: 1



Думаю вам небезинтересно будет прочесть вот эту статью:
Deliver The Power Of Spy++ To Windows Forms With Our New Tool

Цитата
Many developers use the Spy++ tool provided with Visual Studio®. With Spy++, you can understand the window layout of a running application or identify a certain window message that causes a bug. However, when you create a Microsoft® .NET Framework-based application, Spy++ becomes less useful because the window messages and classes intercepted by Spy++ don't correspond to anything a developer uses or even sees. What a developer really wants to see are managed events and property values.

This article describes how to use a new utility called ManagedSpy and its associated library ManagedSpyLib, both of which are available for download from the MSDN®Magazine Web site. Similar to how Spy++ displays Win32® information such as window classes, styles, and messages, ManagedSpy displays managed controls, properties, and events. ManagedSpyLib allows you to programmatically access Windows® Forms controls in another process. You can get and set properties and sync on events in your own code. ManagedSpyLib can also help you build test harnesses and can perform window, message, and event logging.
...


Источник    

Это сообщение отредактировал(а) jfx - 23.6.2006, 16:12
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1372 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.