Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3  Все   Вниз
  Печать  
Автор Тема: Способы управления чужими программами?  (Прочитано 49769 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Hadron
Участник

ru
Offline 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 от Вад » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 16-03-2010 17:22 » 

EnumChildWindows
GetDlgItem
Улыбаюсь
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #2 : 16-03-2010 17:25 » 

EnumChildWindows это доступ к дочерним окнам
значит поиск элементов управления выполняется функцией GetDlgItem?



Спасибо теперь есть с чем покопаться Ага
« Последнее редактирование: 27-03-2010 09:39 от RXL » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 16-03-2010 17:43 » 

Hadron, GetDlgItem - это вытаскивание хендла дочернего контрола с окна по известному ID. Хендлы - врЕменные. То есть получил хендл на контрол - поработал с ним локально, забыл. Хранить нельзя )
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #4 : 18-03-2010 17:14 » 

Очень бы хотел взглянуть на код который бы например мог в открытой папке МОИ ДОКУМЕНТЫ изменять строчку АДРЕС, или нажимать какую либо кнопку.
И еще у меня один вопрос можно ли получить неизвестный ID как либо?
Например абсолютно неизвестная мне программа а мне нужно создать типа скрипта, который бы вытаскивал из открытого окна нужную информацию, или я бы мог вносить в эту программу, данные программно?
Заранее спасибо за ответ.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 18-03-2010 21:43 » 

Можно с помощью Spy++ (тул входит в пакет VS) посмотреть иерархию окон нужного приложения.

С вытаскиванием информации есть тонкости: если контрол стандартный и совместимый со старыми версиями Windows - то тут всё просто, через границу процесса можно слать любые сообщения. А вот у всяких TreeView так уже не получится, для управления деревом и другими продвинутыми контролами придётся подвешивать хук, чтобы внедряться в адресное пространство нужного процесса, и уже отдавая команды хуку, дёргать необходимые контролы. Про кастомные контролы вообще сложно что-то сказать - если программа, которой нужно управлять, такие имеет, то потребуется знание о том, как они работают и на какие сообщения реагируют.

Это не говоря про COM, ActiveX и т.п.
Записан
Hadron
Участник

ru
Offline Offline

« Ответ #6 : 19-03-2010 16:19 » 

Большое спасибо за подсказку Улыбаюсь . Интересно по какому тогда принципу работает сама Spy++ ?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 20-03-2010 08:47 » 

Интересно по какому тогда принципу работает сама Spy++ ?
Элементарный доступ к структуре окон приложения получить несложно: в WinAPI есть набор функций для перечисления окон:
EnumWindows - перечисляет все окна, не имеющие родителей
EnumThreadWindows - для перечисления всех окон, принадлежащих потоку
EnumChildWindows - перечисление всех дочерних окон заданного окна

Имея handle окна, можно узнать его класс. Spy++ примерно этим и занимается: собирает минимальную доступную информацию по дереву: иерархия, классы и заголовки окон.

Собственно, описанные выше сложности с манипулированием продвинутыми контролами (ListView, TreeView и т.п.) относятся уже к активным действиям над ними: хэндл-то получить можно и через границу процесса, а вот развернуть определённый узел, выделить элемент, или что-то ещё - эти сообщения не получится отправить окнам напрямую, и потому нужен хук.
« Последнее редактирование: 20-03-2010 08:50 от Вад » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #8 : 23-03-2010 00:55 » 

вот тут что-то подобное было
https://forum.shelek.ru/index.php/topic,8193.msg128006.html#msg128006
Записан

С уважением Lapulya
Hadron
Участник

ru
Offline 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 Это дочернее окно,  в чем ошибка?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 27-03-2010 06:47 » 

а ты уверен, что ID== восьмеричному 15, то есть десятичному 13 ? Улыбаюсь   (в C++ , если число начинается с 0 и не с 0x , то это восьмеричное число)
или у тебя вообще 16-ричное число было, а ты написал 00000015 вместо 0x00000015
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 27-03-2010 06:50 » 

и ещё - case обёртывай в блок {}

                case ID_POISKINDEFICATORA_GO:
                {         
                        //EnumWindows(&EnumWindowsWnd,0);
                        .....
                        ....
                }
                break;

это и красивее и безопаснее
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #12 : 27-03-2010 06:55 » 

00000015 я взял из SPY++ как оно есть, значит Spy++ может выдавать адрес в разных исчислениях?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 27-03-2010 06:59 » 

спай показывает в хексах - пиши 0x00000015
Записан

Hadron
Участник

ru
Offline 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 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 27-03-2010 07:11 » 

а если так
 hUU = GetDlgItem(hBu,(int)0x00000015);
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 27-03-2010 07:14 » 

покажи ка скрин спая и то, что ты пытаешься посмотреть )
Записан

Hadron
Участник

ru
Offline 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 Кб - загружено 789 раз.)
« Последнее редактирование: 27-03-2010 09:41 от RXL » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 27-03-2010 08:00 » 

попробуй

                      hBu = FindChildWindowEx(hYY,0,"MDIClient",NULL);
     
Записан

Hadron
Участник

ru
Offline 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 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 27-03-2010 15:31 » 

я про иерархию окон тоже сразу подумал, но не увидел ошибку - да и загорожено на скрине всё )
Записан

Hadron
Участник

ru
Offline 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;
ТЕПЕРЬ пытаюсь например раскрыть программно комбобокс и выбрать элемент. но код ничего не меняет в чем причина
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 28-03-2010 16:42 » 

хех, а так

SendMessage(hUU,CB_SHOWDROPDOWN,(WPARAM)1,(LPARAM)0);


А выбрать значение можно и без раскрытия - CB_SETCURSEL
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #23 : 28-03-2010 18:00 » 

ага работает спасибо. И еще один вопрос, из таблиц с помощью хука инфу можно выдернуть, или есть похожие способы?
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #24 : 28-03-2010 18:45 » 

из каких таблиц?
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #25 : 29-03-2010 03:41 » 

И еще один вопрос, из таблиц с помощью хука инфу можно выдернуть
да, из каких, действительно , таблиц ? )
Например, из моей таблицы не выдернешь - у меня вся таблица саморисованная
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #26 : 29-03-2010 14:51 » 

Ну  например DBGrid, MSFlexGrid,DataGrid.  А черт его знает...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #27 : 29-03-2010 16:12 » 

Hadron, изучай спаем, читай мануалы на предмет сообщений - больше тут ничего не поделаешь Улыбаюсь
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 29-03-2010 18:11 » 

Поддерживаю: нужно добыть список оконных сообщений, отправляемых этим контролам. Попробовать поотправлять сообщения: если будет работать и так - хорошо. Не будет - придётся делать хук-прокси для передачи сообщений через границу процесса.
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #29 : 30-03-2010 13:19 » 

вирус пишется... надо полагать... обычно так не поступают. что будет с вашим приложением, если изменится реализация контрола?
Записан

С уважением Lapulya
Страниц: [1] 2 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines