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

Поиск:

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


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

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