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

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

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

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

lapulya, почему сразу вирус? Даже Lingvo позволяет себе вешать хуки, чтобы по горячим клавишам дёргать выделенный текст в других приложениях и искать в словаре.
Записан
Hadron
Участник

ru
Offline Offline

« Ответ #31 : 30-03-2010 14:45 » 

Нет я для вирусмейкера очень мало знаком с С++, я лиш пытаюсь приобрести знания. Например если программа созданная другим программистом недостаточно удобна, или быстро работает. Почему бы не создать для нее вспомогательную программу где были бы реализованы дедостающие возможности. При этом доступ к самой базе данных затруднен, (подлючение сторонними приложениями будет, я полагаю, инициализироваться как взлом), а вот когда логин пароль например введены, дальнейшие манипуляции с пощощю API как я считаю незаметны и безобидны. Хотя я может быть и не прав?
Записан
Hadron
Участник

ru
Offline Offline

« Ответ #32 : 30-03-2010 14:52 » 

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

ru
Offline Offline

« Ответ #33 : 31-03-2010 18:32 » 

Код:
 HWND hwnd;
    HMENU uu;

switch (message)
{


case WM_COMMAND:
wmId    = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
                case ID_YUYU:
{
                                           hwnd = FindWindow("OpusApp", 0);
                                           uu = GetMenu(hwnd);
                                            uu = GetSubMenu(uu, 2);
   
    //PostMessage(hwnd, WM_COMMAND, uu, 0)
 
}
                  break;
почему неработает GetMenu(hwnd) ? все облазил понять немогу
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #34 : 31-03-2010 18:37 » 

а как выражается то, что она не работает ? Улыбаюсь

Цитата
If the specified window has no menu, the return value is NULL. If the window is a child window, the return value is undefined.
так же, если сам хендл окна ==0
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #35 : 31-03-2010 18:42 » 

CXX030 ERROR Expression cannot be evaluated , в общем ==0
Записан
Hadron
Участник

ru
Offline Offline

« Ответ #36 : 31-03-2010 18:45 » 

если указать ID самого контрола то функция возвращает то же значение , но уже не GetSubMenu зощвращает ==0
Записан
Hadron
Участник

ru
Offline Offline

« Ответ #37 : 31-03-2010 18:47 » 

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

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


« Ответ #38 : 31-03-2010 18:48 » 

Код:
HWND FindWindow(
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName
);

попробуй

Код:
hwnd = FindWindow(0,"OpusApp");
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #39 : 31-03-2010 18:54 » 

нет OpusApp это класс окна, (M WORD) иначе hWnd = 0x0000000.
Здесь загвоздка в GetMenu(hwnd).
Записан
Hadron
Участник

ru
Offline Offline

« Ответ #40 : 31-03-2010 19:01 » 

на бейсике тоже не получается. а вот собственное меню на бейсике получилось вытащить через (me.hWnd) значит функция должна работать.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #41 : 31-03-2010 19:03 » 

Hadron, а ты точно своё окно находишь - по классу одному то ? )
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #42 : 31-03-2010 19:13 » 

Вордовское окно у меня одно, да и поначалу в другой проге искал меню, та же ситуация.
Записан
Hadron
Участник

ru
Offline Offline

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

HWND hwnd;
HMENU uu;
hwnd = FindWindow("OpusApp", 0);
uu = GetMenu(hwnd);
uu = GetSubMenu(uu, 2);
значит по логике вещей эти стоки правильны? если учитывать что hWnd окно именно то что я ищу.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #44 : 31-03-2010 19:21 » 

может и правильные, я щас не могу попробовать Улыбаюсь

но

1) может всё же ищется не то окно, но с тем же классом и без меню
2) зарегистрирован ли класс в винде ?
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #45 : 31-03-2010 19:26 » 

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

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


« Ответ #46 : 31-03-2010 19:30 » 

Hadron, надо ещё название - текст из заголовка
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #47 : 31-03-2010 19:35 » 

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

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


« Ответ #48 : 31-03-2010 19:38 » 

ага

GetWindowText

то, что в заголовке окна пишется
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #49 : 31-03-2010 19:43 » 

Проверил в обоих случаях адрес одинаковый, значит окно нужное. Остается 2 причина незарегистрированный класс. Но класс например вордовский обязательно должен быть зарегистрирован в Windows
Записан
Hadron
Участник

ru
Offline Offline

« Ответ #50 : 31-03-2010 19:49 » 

Может что то с меню? Может меню не идентифицировано в приложении, больше ничего на ум не приходит.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #51 : 31-03-2010 19:59 » 

может там меню особое ? )
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #52 : 02-04-2010 15:20 » 

Знаеш какой интересный факт я заметил, В том приложении в котором я смог добраться до меню, меню не имело самостоятельный класс, т.е. оно относится к классу самого окна приложения, а в других двух случаях они являлись самостоятельным классом, как например все остальные контролы.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #53 : 02-04-2010 15:40 » 

ну дык, значит GetMenu не канает

Цитата
Remarks

GetMenu does not work on floating menu bars. Floating menu bars are custom controls that mimic standard menus; they are not menus. To get the handle for a floating menu bar, use the Active Accessibility APIs.

что имеется в виду под Active Accessibility APIs , не знаю
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #54 : 02-04-2010 16:41 » 

Хук должен находиться в DLL если я хочу перехватить инфу в другом приложении(Глобальный)? А если хук ставится на программу которая его и вызывает то не нужно вызывать хук из DLL (локальный). Ну что то навроде этого. Вообще эти меню представляют собой контролы с подряд стоящими кнопками, я подозреваю они все проиндексированы, есть интересно способ вызова кликов на эти кнопки через индексы?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #55 : 02-04-2010 16:46 » 

Hadron, рекомендую пошуршать прицелом спая мо менюшке, будешь приятно удивлён )
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #56 : 02-04-2010 16:52 » 

Цитата
Один из способов — использование Active Accessibility (WinAPI). Это API как раз для вспомогательных программ. В комплекте с Platform SDK шёл Accessibility Explorer. Он может дать представление о возможностях Active Accessibility.
Я пробежаля прицелом спая по менюшке ворда, но смог лиш добраться до ID всего контрола меню. А черт его знает...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #57 : 02-04-2010 16:54 » 

вот вот - кнопки то рисованные. А теперь зацепись за фрейм и подсматривай сообщения, которые летят во время нажатия на кнопку меню
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #58 : 02-04-2010 17:11 » 

WM_LBUTTONDOWN  wParam: 00000001 IParam000A003
WM_LBUTTONUP

и у меня такие ощущения что передаются коодинаты клика, но координаты не превязанные к контролу а координаты экрана полагаю
Записан
Hadron
Участник

ru
Offline Offline

« Ответ #59 : 02-04-2010 18:47 » 

Нет ссылки на исходник или листинг глобального хука (DLL и EXE), не догоняю как должно все работать
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #60 : 02-04-2010 18:57 » 

вот я писал недавно программку, которая , вообще-то, должна была обеспечивать прикрытие, быстро вырубая контру (или даже, когда окно свёрнуто) по нажатию кнопки VK_SUBTRACT (серый минус)


Работает, правда жизнь показала, что быстрее всего контра вырубается по настройке в самой игре выхода на горячую клавишу "серый плюс" Отлично

* PRJ_ANTIPALEVO.rar (32.06 Кб - загружено 708 раз.)
« Последнее редактирование: 02-04-2010 19:30 от Алексей1153++ » Записан

Hadron
Участник

ru
Offline Offline

« Ответ #61 : 02-04-2010 19:00 » 

Улыбаюсь большое спасибо
Записан
Hadron
Участник

ru
Offline Offline

« Ответ #62 : 18-04-2010 13:43 » 

Код:
LRESULT CALLBACK SysMsgProc(

    int code, // hook code
    WPARAM wParam, // removal flag
    LPARAM lParam // address of structure with message
   )
{
//Передать сообщение другим ловушкам в системе
CallNextHookEx(SysHook, code, wParam, lParam);

    hwnd = FindWindow("ThunderRT6FormDC","Vzlom");
    hwnd = GetDlgItem(hwnd,0x00000002);
    //SendMessage(hwnd,WM_GETTEXT ,(WPARAM)0,(LPARAM)"uuu");
//int fty =((tagMSG*)lParam)->message;
//fty == "ddfffff";
    SendMessage(hwnd,WM_SETTEXT ,(WPARAM)0,(LPARAM)((tagMSG*)lParam)->message);
//Проверяю сообщение
if (code == HC_ACTION)
{
//Получаю идентификатор окна сгенерировавшего сообщение
Wnd=((tagMSG*)lParam)->hwnd;
       
//Проверяю тип сообщения.
//Если была нажата левая кнопка мыши
//и удержана кнопка Control, то ...
        if (((tagMSG*)lParam)->message == WM_RBUTTONDOWN)
{
            //SendMessage(hwnd,WM_SETTEXT ,(WPARAM)0,(LPARAM)"uuu");
SendMessage(Wnd, EM_SETPASSWORDCHAR, 0, 0);
InvalidateRect(Wnd, 0, true);
}
}

return 0;
}
Всем привет, у меня одна проблемка, не получается узнать какие сообщения поступают от приложений, вверху код вызываемой функции Хука, я нашел с помощью
Код:
hwnd = FindWindow("ThunderRT6FormDC","Vzlom");
    hwnd = GetDlgItem(hwnd,0x00000002);
этих строк нужный мне текст бокс и с помощью SendMessage(hwnd,WM_SETTEXT ,(WPARAM)0,(LPARAM)((tagMSG*)lParam)->message);  пытаюсь узнать какие сообщения получает приложения, но почему-то SendMessage(hwnd,WM_SETTEXT ,(WPARAM)0,(LPARAM)lParam); вот эта строка выводит какието символы, а та что повыше вообще ничего не выводит, хотя
Код:
if (((tagMSG*)lParam)->message == WM_RBUTTONDOWN)
срабатыват и нормально работает.
Вообще данный код призван убирать звездочки из парольного окна.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #63 : 18-04-2010 17:15 » 

Hadron, очень непонятно пишешь, сформулируй предложения нормально ))
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #64 : 18-04-2010 19:56 » 

ОК  Улыбаюсь , Короче у меня не работает SendMessage(hwnd,WM_SETTEXT ,(WPARAM)0,(LPARAM)((tagMSG*)lParam)->message); вот эта беда в чем тут подвох, полный код выше,
SendMessage(hwnd,WM_SETTEXT ,(WPARAM)0,(LPARAM) lParam); вот такое выражение какие то каракули рисует, как расшифровать lParam ?
Мне бы узнать в чем я туплю, и все Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #65 : 19-04-2010 03:02 » 

Код:
lResult = SendMessage(      // returns LRESULT in lResult
     (HWND) hWndControl,      // handle to destination control
     (UINT) WM_SETTEXT,      // message ID
     (WPARAM) wParam,      // = (WPARAM) () wParam;
    (LPARAM) lParam      // = (LPARAM) () lParam;
 ); 
Parameters

wParam - This parameter is not used.
lParam - Pointer to a null-terminated string that is the window text.

поэтому шлёшь текст так
Код:
const char* pTXT=...;
SendMessage(hwnd,WM_SETTEXT ,0,(LPARAM)(pTXT);

осталось в отладчике точно убедиться, что в pTXT правильная строка, оканчивающаяся нулём. Ещё, может, проблемы с юникодом - но тут я уже не смогу подсказать, не сталктвался )
Записан

Hadron
Участник

ru
Offline Offline

« Ответ #66 : 19-04-2010 14:50 » 

насколько я понял в моем случае вместо ... (точек) ставим lparam
const char* pTXT=lParam;
но возникает ошибка
 error C2440: 'initializing' : cannot convert from 'LPARAM' to 'const char *'
Записан
Hadron
Участник

ru
Offline Offline

« Ответ #67 : 19-04-2010 14:56 » 

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

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


« Ответ #68 : 20-04-2010 02:47 » 

насколько я понял в моем случае вместо ... (точек) ставим lparam
const char* pTXT=lParam;
вообще-то, вместо трёх точек там - строка, а не lParam Улыбаюсь Попробуй сначала просто константу, например "123строка".

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

Hadron
Участник

ru
Offline Offline

« Ответ #69 : 20-04-2010 17:08 » 

Тогда в каких случаях используются хуки? Имеется ввиду в чем их польза? на счет строки я и так без проблем пересылал текст, код ниже.
Код:
SendMessage(hwnd,WM_GETTEXT ,(WPARAM)0,(LPARAM)"Hello World");
Вся загвоздка в том как с помощью хука можно воздействовать на контролы, на которые стандартными способами нельзя воздействовать.
Цитата
С вытаскиванием информации есть тонкости: если контрол стандартный и совместимый со старыми версиями Windows - то тут всё просто, через границу процесса можно слать любые сообщения. А вот у всяких TreeView так уже не получится, для управления деревом и другими продвинутыми контролами придётся подвешивать хук, чтобы внедряться в адресное пространство нужного процесса, и уже отдавая команды хуку, дёргать необходимые контролы. Про кастомные контролы вообще сложно что-то сказать - если программа, которой нужно управлять, такие имеет, то потребуется знание о том, как они работают и на какие сообщения реагируют.
цитата принадлежит Ваду (Ответ №5)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #70 : 20-04-2010 17:20 » 

Hadron, ну так Вад и расскажет Улыбаюсь

Хук ставится для возможности перехватывать сообщения, идущие к окну (то есть, можно сообщения передать дальше не меняя, а можно и поменять, либо просто логгировать, снифить и так далее).
А отправлять сообщения можно без хука.

Наверное, Вад имеет в виду как раз случай, когда хочется менять поведение того же TreeView "на лету"
Записан

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

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

« Ответ #71 : 21-04-2010 08:33 » 

Наверное, Вад имеет в виду как раз случай, когда хочется менять поведение того же TreeView "на лету"
Я имею в виду, что ты не можешь через границу процесса сказать дереву "развернись" или "вставь узел туда-то". То есть, отправить сообщение можешь, но эффекта никакого не будет.

Поэтому на процесс вешается хук, который может получать сообщения от внешнего процесса (это, вообще говоря, возможно даже с помощью оконных сообщений - например, для WM_USER + X через границу процесса всё прекрасно ходит), и ретранслировать их в нужный элемент нужного окна.

Советую Рихтера почитать - у него эта тема, насколько я помню, хорошо освещалась.
« Последнее редактирование: 21-04-2010 08:35 от Вад » Записан
Hadron
Участник

ru
Offline Offline

« Ответ #72 : 23-04-2010 15:43 » 

Спасибо за пояснения  Здесь была моя ладья... Будем разбираться.
Записан
Страниц: 1 2 3 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines