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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать HWND кнопки 
:(
    Опции темы
kapbepucm
Дата 20.9.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Окно сторонней программы с кучей кнопок. Надо Handle конкретной кнопки получить. Знаю расположение, надпись "Start" и кнопка активна (Enter'ом сразу нажимается).
Пробывал разные способы, но получил только Handle родительского окна. Может кнопка просто нарисована? Подскажите что-нибудь.

Это сообщение отредактировал(а) kapbepucm - 20.9.2007, 16:26


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
zkv
Дата 20.9.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



посмотри спаем (spy++ в составе VS) ID кнопки, через него и дотягивайся
PM MAIL   Вверх
Alexeis
Дата 20.9.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



kapbepucm, Так FindWindow и ищет только родительские окна. 

Цитата

To search child windows, beginning with a specified child window, use the FindWindowEx function.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
NikeDeForest
Дата 20.9.2007, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я делал глобальный хук на правую кнопку мыши и щелкал над необходимым мне элементом чужого приложения
--------------------
Еще один вопрос ...
PM   Вверх
Alexeis
Дата 20.9.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



NikeDeForest, Ну это примерно как пушкой по воробьям smile . 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Mihhail
Дата 20.9.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(kapbepucm @  20.9.2007,  20:22 Найти цитируемый пост)
Окно сторонней программы с кучей кнопок. Надо Handle конкретной кнопки получить. Знаю расположение, надпись "Start" и кнопка активна (Enter'ом сразу нажимается).Пробывал разные способы, но получил только Handle родительского окна.

Если известен Handle родительского окна, перебираем дочерние окна и проверяем надписи на них.
Код

HwSt = GetWindow( Handle, GW_CHILD );
while( HwSt ){
   GetWindowText( HwSt, str, max );
   if( !strcmp( str, "Start" ) ) break;
   HwSt = GetNextWindow( HwSt, GW_HWNDNEXT );
   }
if( HwSt ) ...... //Найдено нужное  


Если известны примерные координаты кнопки можно воспользоваться функцией:
HWND ChildWindowFromPoint(
    HWND hWndParent,    // handle to parent window
    POINT Point               // structure with point coordinates
   );

Это сообщение отредактировал(а) Mihhail - 20.9.2007, 21:39
PM MAIL WWW   Вверх
kapbepucm
Дата 21.9.2007, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо, сейчас попробую!


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
NiJazz
Дата 21.9.2007, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



PM MAIL   Вверх
kapbepucm
Дата 21.9.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А есть хороший програмный способ узнать HWND дочернего окна, незная HWND родителя но зная заголовок? Например хочу увидеть все кнопки "OK".

Это сообщение отредактировал(а) kapbepucm - 21.9.2007, 14:33


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Alexeis
Дата 21.9.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  По крайней мере можно найти все окна и пройтись по всем дочерним компонентам...


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
NikeDeForest
Дата 21.9.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Alexeis, мне так проще показалось smile
--------------------
Еще один вопрос ...
PM   Вверх
Alexeis
Дата 21.9.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



NikeDeForest, так я не с точки зрения простоты, а с точки зрения нагрузки на систему.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
kapbepucm
Дата 2.10.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alexeis @  21.9.2007,  13:19 Найти цитируемый пост)
По крайней мере можно найти все окна и пройтись по всем дочерним компонентам...
Не могу нигде пример найти... Задача: есть форма чужого процесса с кучей кнопок (явно дочки). Есть несколько кнопок "OK". Мне надо знать HWND всех этих кнопок. Покажите алгоритм пробега по дочкам. Уже, наверно, самостоятельно не справлюсь...
smile smile smile 

Это сообщение отредактировал(а) kapbepucm - 2.10.2007, 16:25


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Alexeis
Дата 2.10.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



kapbepucm, так Mihhail в своем уже показал перебор дочерних компонентов. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
kapbepucm
Дата 3.10.2007, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Странно, но данным примером я нахожу первую дочку и больше ничего... Может есть способ иначе действующий?

Это сообщение отредактировал(а) kapbepucm - 3.10.2007, 07:58


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
SenkraD
Дата 3.10.2007, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



kapbepucm,  вот кусок кода с Архангельского по Builder но всё кроме вывода API:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UChildWin1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// для варианта поиска окна редактирования
AnsiString S = "Edit";
HWND hEdit;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
char buf[256], buf2[256];

bool __stdcall EnumChild(HWND hWind, LPARAM lParam)
{
 SendMessage(hWind, WM_GETTEXT, sizeof(buf), (LPARAM)(LPCTSTR)buf);
 GetClassName(hWind,buf2,sizeof(buf2));
 Form1->Memo1->Lines->Add(AnsiString(buf) + " - класс " + AnsiString(buf2));
// для варианта поиска окна редактирования
/* if(AnsiString(buf2) == *(AnsiString *)lParam)
 {
  hEdit = hWind;
  return false;
 }*/
 return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 HWND hWnd;
 // получение дескриптора окна
 if(! (hWnd = FindWindow("SciCalc","Калькулятор")))
 {
  WinExec("Calc", SW_SHOWNA);
  hWnd = FindWindow("SciCalc","Калькулятор");
 }
 // получение списка дочерних окна
 EnumChildWindows(hWnd, (WNDENUMPROC)EnumChild, 0);
 // для варианта поиска окна редактирования
 //EnumChildWindows(hWnd, (WNDENUMPROC)EnumChild, (LPARAM)&S);
 // получение списка разделов меню
 HMENU HM = GetMenu(hWnd);
 HMENU SubM = NULL;
 int CountM = GetMenuItemCount(HM);
 int CountS;

 for(int i = 0; i < CountM; i++)
 {
  GetMenuString(HM, i, buf, sizeof(buf), MF_BYPOSITION);
  Memo2->Lines->Add(buf);
  if(SubM = GetSubMenu(HM, i))
  {
   CountS = GetMenuItemCount(SubM);
   for(int k = 0; k < CountS; k++)
   {
    GetMenuString(SubM, k, buf, sizeof(buf), MF_BYPOSITION);
    Memo2->Lines->Add("   " + AnsiString(buf));
   }
  }
 }
}
//---------------------------------------------------------------------------




--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
kapbepucm
Дата 3.10.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попытасля поработать с калькулятором- всё работает идеально (все дочки видны). Но если перейти к моей сторонней форме, то средствами EnumChildWindows или GetWindow нахожу только одну дочку без заголовка с каким-то классом Container60000000. Некоторое время назад комплекс VS потерпел у меня крах (по независящим от меня обстоятельствам пока не имею возможности это исправить), поэтому не могу пользоваться SPY++. Как поступать дальше?
NikeDeForest, по-подробнее расскажи как пушкой по воробьям, что-то даже это направляет меня к одной и той-же дочке...

Это сообщение отредактировал(а) kapbepucm - 3.10.2007, 14:48


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Earnest
Дата 3.10.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Скорее всего, форма и содержит одно окно-контейнер, а все кнопки - уже в нем.
Проверь это дело с помошью Спая.
И ищи не конкретно в данном окне, а в этой самой дочке.
Кстати, вложенность может быть и глубже...


--------------------
...
PM   Вверх
NikeDeForest
Дата 3.10.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



запуск хука
Код

 hModule=::LoadLibrary("OnClick.dll");                  
                        uk=(return_hw*)::GetProcAddress((HMODULE)hModule,"return_hw");
                       (uk)(true,hInst,hWnd);


остановка хука
Код

uk(false,hInst,hWnd);
                    FreeLibrary(hModule);
                    break;



сама длл с хуком

Код


HWND hw_client; //здесь будет хендл окна
HHOOK hHOOK;

HINSTANCE hInst;
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    hw_client=0;
    
    hInst=HINSTANCE(hModule);
    return TRUE;
}


//функция перехватчик сообщения
LRESULT CALLBACK CatchMessage(int code, WPARAM wParam, LPARAM lParam)
{


LONG tempHook=CallNextHookEx(hHOOK,code,wParam,lParam);

if(code==HC_ACTION)
{
    {
          //здесь хендл окна над которым был щелчек
       hw_client=((tagMSG*)lParam)->hwnd; 
       
    }
}
if(code<0)
return tempHook;

return 0;
}



// Эксопортируемая функция, возвращающая хендл окна
DllExport void  __stdcall return_hw(bool State, HINSTANCE hInstance)
{
    if(State==true)
    {
      hHOOK=SetWindowsHookEx(WH_GETMESSAGE, &CatchMessage,hInst,0);
    }
    else
        UnhookWindowsHookEx(hHOOK);

    
}




Это по сути пример, переделанный из книги "С++ глазами хакера". Если есть эта книга, то туда глянь. Там в том числе и описано то, что тебе здесь уже предлагали - пробежать все окна (в том числе дочерние).
--------------------
Еще один вопрос ...
PM   Вверх
NikeDeForest
Дата 3.10.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот, это будет для тебя более фундаментально и полезно http://www.rsdn.ru/article/baseserv/hookdll.xml
--------------------
Еще один вопрос ...
PM   Вверх
kapbepucm
Дата 25.10.2007, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Приветствую, это опять я. "Допрашивая" спая, удалось выяснть как там всё устроено. Как Earnest говорил, там многоуровневая вложеность. Теперь задача несколько поменялась. Мне надо пройтись от дочки до "первого" родителя. Подскажите, как это можно реализовать, изначально зная только HWND.


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Andrey44
Дата 26.10.2007, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Как Earnest говорила smile 


Изначально зная HWND чего?

Если кнопки то GetParent(hwnd) и так далее до главного окна.


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


Опытный
**


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

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



Русский язык допускает обращаться к неопределённому лицу как к лицу муж. рода smile
А по делу, GetParent- это первое, что я испытывал; так я получал 0 в ответ smile. Потому и спрашиваю, может что ещё есть. 


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Andrey44
Дата 26.10.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Подожди, а зачем тебе зная HWND кнопки получать HWND родителя? smile 


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


Опытный
**


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

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



Хочу понять, почему то, что умеет спай, не могу реализовать я (стандартными функциями API). Собственоручно выяснил, что у главного родителя нет детей, а у дочерней кнопки нет родителя- так спай имеет другое (я думаю он прав) мнение. Что за $$$$$? На стандартном виндовском калькуляторе всё получается smile

Это сообщение отредактировал(а) kapbepucm - 26.10.2007, 14:14


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Andrey44
Дата 26.10.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



 smile Не понял, так что, кнопка сама по-себе живет?


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


Опытный
**


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

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



Судя по тому, что GetParent говорит, да smile


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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