Hadron
Участник
Offline
|
|
« : 16-03-2010 17:15 » |
|
BOOL CALLBACK EnumWindowsWnd( HWND hwnd, // handle to parent window LPARAM lParam // application-defined value ) { SendMessage(hwnd, WM_SETTEXT, 0,LPARAM(LPCTSTR("I See You"))); EnumChildWindows(hwnd,&EnumChildWnd,0); return TRUE; } ......
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) ......
case ID_MYCOMMANDS_ISEEYOU: while (TRUE) { EnumWindows(&EnumWindowsWnd, 0); } break; ......
вышеизложенный код позволяет переименовать все открытые окна (кроме дочерних), в I SEE YOU есть ли способы например изменить еще и LABLE, KomboBox, и другие элементы управления
|
|
« Последнее редактирование: 20-03-2010 08:51 от Вад »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 16-03-2010 17:22 » |
|
EnumChildWindows GetDlgItem
|
|
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #2 : 16-03-2010 17:25 » |
|
EnumChildWindows это доступ к дочерним окнам значит поиск элементов управления выполняется функцией GetDlgItem? Спасибо теперь есть с чем покопаться
|
|
« Последнее редактирование: 27-03-2010 09:39 от RXL »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 16-03-2010 17:43 » |
|
Hadron, GetDlgItem - это вытаскивание хендла дочернего контрола с окна по известному ID. Хендлы - врЕменные. То есть получил хендл на контрол - поработал с ним локально, забыл. Хранить нельзя )
|
|
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #4 : 18-03-2010 17:14 » |
|
Очень бы хотел взглянуть на код который бы например мог в открытой папке МОИ ДОКУМЕНТЫ изменять строчку АДРЕС, или нажимать какую либо кнопку. И еще у меня один вопрос можно ли получить неизвестный ID как либо? Например абсолютно неизвестная мне программа а мне нужно создать типа скрипта, который бы вытаскивал из открытого окна нужную информацию, или я бы мог вносить в эту программу, данные программно? Заранее спасибо за ответ.
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #5 : 18-03-2010 21:43 » |
|
Можно с помощью Spy++ (тул входит в пакет VS) посмотреть иерархию окон нужного приложения.
С вытаскиванием информации есть тонкости: если контрол стандартный и совместимый со старыми версиями Windows - то тут всё просто, через границу процесса можно слать любые сообщения. А вот у всяких TreeView так уже не получится, для управления деревом и другими продвинутыми контролами придётся подвешивать хук, чтобы внедряться в адресное пространство нужного процесса, и уже отдавая команды хуку, дёргать необходимые контролы. Про кастомные контролы вообще сложно что-то сказать - если программа, которой нужно управлять, такие имеет, то потребуется знание о том, как они работают и на какие сообщения реагируют.
Это не говоря про COM, ActiveX и т.п.
|
|
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #6 : 19-03-2010 16:19 » |
|
Большое спасибо за подсказку . Интересно по какому тогда принципу работает сама Spy++ ?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #7 : 20-03-2010 08:47 » |
|
Интересно по какому тогда принципу работает сама Spy++ ?
Элементарный доступ к структуре окон приложения получить несложно: в WinAPI есть набор функций для перечисления окон: EnumWindows - перечисляет все окна, не имеющие родителей EnumThreadWindows - для перечисления всех окон, принадлежащих потоку EnumChildWindows - перечисление всех дочерних окон заданного окна Имея handle окна, можно узнать его класс. Spy++ примерно этим и занимается: собирает минимальную доступную информацию по дереву: иерархия, классы и заголовки окон. Собственно, описанные выше сложности с манипулированием продвинутыми контролами (ListView, TreeView и т.п.) относятся уже к активным действиям над ними: хэндл-то получить можно и через границу процесса, а вот развернуть определённый узел, выделить элемент, или что-то ещё - эти сообщения не получится отправить окнам напрямую, и потому нужен хук.
|
|
« Последнее редактирование: 20-03-2010 08:50 от Вад »
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #8 : 23-03-2010 00:55 » |
|
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #9 : 27-03-2010 06:44 » |
|
case ID_POISKINDEFICATORA_GO: //EnumWindows(&EnumWindowsWnd,0); hYY = FindWindow("ThunderRT6MDIForm",NULL); hBu = FindWindowEx(hYY,0,"MDIClient",NULL); hUU = GetDlgItem(hBu,00000015); ShowWindow (hUU,SW_HIDE); break;
В чем здесь ошибка? переменная hUU является всеравно нулевой, 00000015 это Control ID hBu Это дочернее окно, в чем ошибка?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 27-03-2010 06:47 » |
|
а ты уверен, что ID== восьмеричному 15, то есть десятичному 13 ? (в C++ , если число начинается с 0 и не с 0x , то это восьмеричное число) или у тебя вообще 16-ричное число было, а ты написал 00000015 вместо 0x00000015
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 27-03-2010 06:50 » |
|
и ещё - case обёртывай в блок {}
case ID_POISKINDEFICATORA_GO: { //EnumWindows(&EnumWindowsWnd,0); ..... .... } break;
это и красивее и безопаснее
|
|
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #12 : 27-03-2010 06:55 » |
|
00000015 я взял из SPY++ как оно есть, значит Spy++ может выдавать адрес в разных исчислениях?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 27-03-2010 06:59 » |
|
спай показывает в хексах - пиши 0x00000015
|
|
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #14 : 27-03-2010 07:08 » |
|
Нет всеравно hUU = 0x00000000 и CXX0030: Error: Expression cannot be evaluated
case ID_POISKINDEFICATORA_GO: { hYY = FindWindow("ThunderRT6MDIForm",NULL); hBu = FindWindowEx(hYY,0,"MDIClient",NULL); hUU = GetDlgItem(hBu,0x00000015); ShowWindow (hUU,SW_HIDE); } break;
|
|
« Последнее редактирование: 27-03-2010 09:40 от RXL »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 27-03-2010 07:11 » |
|
а если так hUU = GetDlgItem(hBu,(int)0x00000015);
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 27-03-2010 07:14 » |
|
покажи ка скрин спая и то, что ты пытаешься посмотреть )
|
|
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #17 : 27-03-2010 07:21 » |
|
та же ошибка, без изменений, Я может чегото не учел, хотя вот весь код этого блока LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; TCHAR szHello[MAX_LOADSTRING]; LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); HWND hYY, hBu,hUU; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case ID_POISKINDEFICATORA_GO: { hYY = FindWindow("ThunderRT6MDIForm",NULL); hBu = FindWindowEx(hYY,0,"MDIClient",NULL); hUU = GetDlgItem(hBu,(int)0x00000015); ShowWindow (hUU,SW_HIDE); } break;
case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... RECT rt; GetClientRect(hWnd, &rt); DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } да я хотел скрин сразу вставить еще не понял как это делается Вот скрин
|
21.JPG (86.64 Кб - загружено 827 раз.)
|
« Последнее редактирование: 27-03-2010 09:41 от RXL »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 27-03-2010 08:00 » |
|
попробуй
hBu = FindChildWindowEx(hYY,0,"MDIClient",NULL);
|
|
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #19 : 27-03-2010 08:39 » |
|
C:\Program Files\Microsoft Visual Studio\MyProjects\PoiskIndeficatora\PoiskIndeficatora.cpp(163) : error C2065: 'FindChildWindowEx' : undeclared identifier C:\Program Files\Microsoft Visual Studio\MyProjects\PoiskIndeficatora\PoiskIndeficatora.cpp(163) : error C2440: '=' : cannot convert from 'int' to 'struct HWND__ *' Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast появились эти ошибки case ID_POISKINDEFICATORA_GO: { hYY = FindWindow("ThunderRT6MDIForm",NULL); hBu = FindWindowEx(hYY,0,"MDIClient",NULL); hBu = FindWindowEx(hBu,0,"ThunderRT6FormDC",NULL); //hBu = EnumChildWindows(hYY,NULL,0); hUU = GetDlgItem(hBu,(int)0x00000015); ShowWindow (hUU,SW_HIDE); } break;
все заработало, это мой косяк, на скрине все видно там сначала ищем MDIClient а за тем ThunderRT6FormDC и вот на нем то hUU = GetDlgItem(hBu,(int)0x00000015); Большое спасибо за помощ
|
|
« Последнее редактирование: 27-03-2010 09:39 от RXL »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 27-03-2010 15:31 » |
|
я про иерархию окон тоже сразу подумал, но не увидел ошибку - да и загорожено на скрине всё )
|
|
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #21 : 28-03-2010 16:11 » |
|
switch (wmId) { case ID_POISKINDEFICATORA_GO: { TCHAR szTitle[256] = {0}; hYY = FindWindow("ThunderRT6MDIForm",NULL); hBu = FindWindowEx(hYY,0,"MDIClient",NULL); hBu = FindWindowEx(hBu,0,"ThunderRT6FormDC",NULL); hUU = GetDlgItem(hBu,(int)0x00000001); SendMessage(hUU,CB_SHOWDROPDOWN,(WPARAM)0,(LPARAM)0); } break; ТЕПЕРЬ пытаюсь например раскрыть программно комбобокс и выбрать элемент. но код ничего не меняет в чем причина
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 28-03-2010 16:42 » |
|
хех, а так
SendMessage(hUU,CB_SHOWDROPDOWN,(WPARAM)1,(LPARAM)0);
А выбрать значение можно и без раскрытия - CB_SETCURSEL
|
|
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #23 : 28-03-2010 18:00 » |
|
ага работает спасибо. И еще один вопрос, из таблиц с помощью хука инфу можно выдернуть, или есть похожие способы?
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #24 : 28-03-2010 18:45 » |
|
из каких таблиц?
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 29-03-2010 03:41 » |
|
И еще один вопрос, из таблиц с помощью хука инфу можно выдернуть
да, из каких, действительно , таблиц ? ) Например, из моей таблицы не выдернешь - у меня вся таблица саморисованная
|
|
|
Записан
|
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #27 : 29-03-2010 16:12 » |
|
Hadron, изучай спаем, читай мануалы на предмет сообщений - больше тут ничего не поделаешь
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #28 : 29-03-2010 18:11 » |
|
Поддерживаю: нужно добыть список оконных сообщений, отправляемых этим контролам. Попробовать поотправлять сообщения: если будет работать и так - хорошо. Не будет - придётся делать хук-прокси для передачи сообщений через границу процесса.
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #29 : 30-03-2010 13:19 » |
|
вирус пишется... надо полагать... обычно так не поступают. что будет с вашим приложением, если изменится реализация контрола?
|
|
|
Записан
|
С уважением Lapulya
|
|
|
|