Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с HWND, FindWindow итп. 
V
    Опции темы
Newbie1x
Дата 14.9.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте. Я хотел бы нажать кнопку в чужой программе, да, тема уже нираз поднималась, но я уже все перепробовал, кнопка не жмется..

Использую VS 2008 и встроенную в нее Spy++ утилиту.

Вот скрин в спае кнопки, которую нужно нажать:
user posted image

А вот мой код ( при нажатии кнопки в своей программе, должна нажаться кнопка в чужой программе):
Код

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    HWND chwnd;
        HWND phwnd;
        phwnd = FindWindow((LPCWSTR)"GG_SWITCHVIEW", (LPCWSTR)"Garena");
        chwnd = FindWindowEx(phwnd, 0, (LPCWSTR)"Button", (LPCWSTR)"Отправить");
        ::SendMessage(chwnd, WM_LBUTTONDOWN,1, 0x2B0001);
        ::SendMessage(chwnd, WM_LBUTTONUP,0, 0x2B0001);
             }
    };

Однако этого не происходит.

Извините, если вопрос глупый, заранее спасибо.
PM MAIL   Вверх
GremlinProg
Дата 14.9.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



а что это за странные преобразования (LPCWSTR)"GG_SWITCHVIEW" ?
замени их на _T() или _TEXT():
Код

_T("GG_SWITCHVIEW")
_T("Garena")
...

не проходит не SendMessage, а FindWindow/Ex


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Newbie1x
Дата 14.9.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Это я пытался преобразовать в тип, который треубет ф-ция.

Попробовал ваш пример, повылезали ошибки:
error C3861: _T: идентификатор не найден

С _TEXT тоже самое:
_TEXT: идентификатор не найден

Ведь так? Или я что-то не понял?
Код

HWND chwnd;
        HWND phwnd;
        phwnd = FindWindow(_T("GG_SWITCHVIEW"), _T("Garena"));
        chwnd = FindWindowEx(phwnd, 0, _T("Button"), _T("Отправить"));
        ::SendMessage(chwnd, WM_LBUTTONDOWN,1, 0x2B0001);
        ::SendMessage(chwnd, WM_LBUTTONUP,0, 0x2B0001);


Цитата

не проходит не SendMessage, а FindWindow/Ex 

Не понял этой строчки.
PM MAIL   Вверх
Romikgy
Дата 14.9.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(Newbie1x @  14.9.2009,  17:29 Найти цитируемый пост)
phwnd = FindWindow((LPCWSTR)"GG_SWITCHVIEW", (LPCWSTR)"Garena");
        chwnd = FindWindowEx(phwnd, 0, (LPCWSTR)"Button", (LPCWSTR)"Отправить");

пропущено еще одно окно типа #32770


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Newbie1x
Дата 14.9.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тоесть древо надо постепенно раскрывать, тогда я не только 32770 пропустил а еще 1 похоже..  ну вроде попробовал, однако все равно не работает, наверное из-за (LPCWSTR), я не знаю как его верно заменить, тк _T и _TEXT у меня не работают.

Вот что вышло: (Это не работает).
Код

        HWND chwnd,chwnd2,chwnd3, phwnd;
        phwnd = FindWindow((LPCWSTR)"GG_GUIDE_WIN", (LPCWSTR)"Garena");
        chwnd = FindWindowEx(phwnd, 0, (LPCWSTR)"GG_SWITCHVIEW", NULL);
        chwnd2 = FindWindowEx(chwnd, 0, (LPCWSTR)"#32770", NULL);
        chwnd3 = FindWindowEx(chwnd2, 0, (LPCWSTR)"Button", (LPCWSTR)"Отправить");
        ::SendMessage(chwnd3, WM_LBUTTONDOWN,1, 0x2B0001);
        ::SendMessage(chwnd3, WM_LBUTTONUP,0, 0x2B0001);


Это сообщение отредактировал(а) Newbie1x - 14.9.2009, 21:57
PM MAIL   Вверх
GremlinProg
Дата 14.9.2009, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Newbie1x @  14.9.2009,  23:27 Найти цитируемый пост)
Попробовал ваш пример, повылезали ошибки:error C3861: _T: идентификатор не найден

извиняюсь, моя ошибка, :) не посмотрел на объявление функции:
Цитата(Newbie1x @  14.9.2009,  20:29 Найти цитируемый пост)

Код
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {


а не пробовал, BM_CLICK ?
Код

::SendMessage( chwnd3, BM_CLICK, 0, 0 );



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Newbie1x
Дата 14.9.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Попробовал сейчас - тоже не сработало, да и наверное было бы странно,если бы сработало, тк я ловил сообщения при нажатии кнопки, приходили WM_LBUTTONDOWN и WM_LBUTTONUP в 1 параметре 1 и 0, во втором - координаты клика на кнопке.

Не понимаю, почему не работает:( 
PM MAIL   Вверх
Romikgy
Дата 14.9.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



имхо добавь проверку на правильный указатель , ведь есть шанс что не находит окна вообще...


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Newbie1x
Дата 14.9.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, похоже окна вообще не находит.. На счет Send я почти на 100% уверен, что все верно. Щас попробовал создать на билдере приложение, на нем 1 кнопка, нажав на нее в Лабел выводится "Привет".

Сделал КОд:
Код

                                  HWND phwnd, chwnd;
                 phwnd = FindWindow((LPCWSTR)"TForm1", (LPCWSTR)"Form1");
                 chwnd = FindWindowEx(phwnd,0, (LPCWSTR)"TButton", (LPCWSTR)"Button1");
                 ::SendMessage(chwnd, WM_LBUTTONDOWN, 1, 0x10001F);
                 ::SendMessage(chwnd, WM_LBUTTONUP, 0, 0x10001F);


И даже он не работает! Мне кажется причина в (LPCWSTR).. Но я не знаю как правильно окно искать, не было опыта, первый раз работаю с этим.

Вот еще на вашем форуме нашел немного другой способ:
Код

// находим окно калькулятора, зная window class ("SciCalc")
        IntPtr calcWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "SciCalc", null);
        // находим кнопку по имени окна ("1") и имени класса ("Button")
        IntPtr button1 = FindWindowEx(calcWnd, IntPtr.Zero, "Button", "1");


Но такой код у меня СИ отказывается принимать.. Грит чего суешь в HWND указатель :(

Это сообщение отредактировал(а) Newbie1x - 14.9.2009, 22:31
PM MAIL   Вверх
GremlinProg
Дата 14.9.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



если это пройдет, значит проблема в поиске
Код

::SendMessage( (HWND)001508fa, BM_CLICK, 0, 0 );

001508fa - значение HWND кнопки из Spy'я

#32770 - это ощий класс диалога, он не имеет родителя, т.е. его нужно искать через FindWindow,
но если в системе открыто несколько диалогов, то будет выбран первый попавшийся,
тогда можно сначала найти владельца диалога (в Spy он указан, открой свойства диалога)
а саму кнопку можно найти по идентификатору (ID) кнопки (в Spy он тоже есть, открой свойства кнопки) через GetDlgItem

Код

hwndOwner = ::FindWindow( "OwnerClassName", "OwnerWindowName" );
hwndDialog = ::GetLastActivePopup( hwndOwner );
hwndButton = ::GetDlgItem( hwndDialog, ButtonID );



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Newbie1x
Дата 14.9.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

::SendMessage((HWND)001508fa, BM_CLICK, 0, 0);


На такой код СИ ругается.. Наверное все-таки правильно так??
Код

::SendMessage((HWND)0x1508fa, BM_CLICK, 0, 0);


Так не ругается, но и не работает.. :(

Добавлено через 2 минуты и 26 секунд
Код

::SendMessage((HWND)0x260EE2, WM_LBUTTONDOWN, 1, 0x10001F);
::SendMessage((HWND)0x260EE2, WM_LBUTTONUP, 0, 0x10001F);


А вот так уже работает!! Ну хоть что-то у меня работает, как я рад))


Это сообщение отредактировал(а) Newbie1x - 14.9.2009, 22:40
PM MAIL   Вверх
GremlinProg
Дата 14.9.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Newbie1x @  15.9.2009,  00:40 Найти цитируемый пост)
Так не ругается, но и не работает.. :(

Цитата(GremlinProg @  15.9.2009,  00:32 Найти цитируемый пост)
001508fa - значение HWND кнопки из Spy'я




--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Newbie1x
Дата 14.9.2009, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тогда не работало так как я программу перезапустил и идентификатор сменился.. 
Как я выше написал, 0x260EE2 в таком случае нажимает на кнопку.. Теперь надо как-то организовать поиск "Правильно" smile

Добавлено через 6 минут и 10 секунд
Такой вопрос, что есть ButtonID на 3 строке вашего кода в поиске?

Добавлено через 12 минут и 44 секунды
Опять он ругается, что у меня в строке данные об окне лежат и приходится делать преобразование, после чего он опять ничерта не находит.. Как решить эту проблему,
Код

hwndOwner = ::FindWindow((LPCWSTR)"TForm1", (LPCWSTR)"Form1");


Весь КОд:
Код

HWND hwndOwner, hwndDialog, hwndButton;
                 hwndOwner = ::FindWindow((LPCWSTR)"TForm1", (LPCWSTR)"Form1");
                 hwndDialog = ::GetLastActivePopup( hwndOwner );
                 hwndButton = ::GetDlgItem(hwndDialog, 0x2608E6);
                 ::SendMessage(hwndButton, WM_LBUTTONDOWN, 1, 0x10001F);
                 ::SendMessage(hwndButton, WM_LBUTTONUP, 0, 0x10001F);

PM MAIL   Вверх
Andrey44
Дата 15.9.2009, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

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



Код

#include <tchar.h>

HWND chwnd;
        HWND phwnd;
        phwnd = FindWindow(_T("GG_SWITCHVIEW"), _T("Garena"));
        chwnd = FindWindowEx(phwnd, 0, _T("Button"), _T("Отправить"));
        ::SendMessage(chwnd, WM_LBUTTONDOWN,1, 0x2B0001);
        ::SendMessage(chwnd, WM_LBUTTONUP,0, 0x2B0001);



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Newbie1x
Дата 15.9.2009, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Andrey44, 

Спасибо большое, этот иклуд помог, _T заработало и кнопку нашлоsmile Ну и нажалась она соответственно!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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