Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #60 : 02-04-2010 18:57 » |
|
вот я писал недавно программку, которая , вообще-то, должна была обеспечивать прикрытие, быстро вырубая контру (или даже, когда окно свёрнуто) по нажатию кнопки VK_SUBTRACT (серый минус) Работает, правда жизнь показала, что быстрее всего контра вырубается по настройке в самой игре выхода на горячую клавишу "серый плюс"
|
|
« Последнее редактирование: 02-04-2010 19:30 от Алексей1153++ »
|
Записан
|
|
|
|
|
Hadron
Участник
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) срабатыват и нормально работает. Вообще данный код призван убирать звездочки из парольного окна.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #63 : 18-04-2010 17:15 » |
|
Hadron, очень непонятно пишешь, сформулируй предложения нормально ))
|
|
|
Записан
|
|
|
|
Hadron
Участник
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 ? Мне бы узнать в чем я туплю, и все
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
Участник
Offline
|
|
« Ответ #66 : 19-04-2010 14:50 » |
|
насколько я понял в моем случае вместо ... (точек) ставим lparam const char* pTXT=lParam; но возникает ошибка error C2440: 'initializing' : cannot convert from 'LPARAM' to 'const char *'
|
|
|
Записан
|
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #68 : 20-04-2010 02:47 » |
|
насколько я понял в моем случае вместо ... (точек) ставим lparam const char* pTXT=lParam;
вообще-то, вместо трёх точек там - строка, а не lParam Попробуй сначала просто константу, например "123строка". для того чтобы внедрить в адресное пространстово
вот тут точно без экспериментов сказать не могу... Но вообще то, сообщения пересылаться должны и без хуков
|
|
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #69 : 20-04-2010 17:08 » |
|
Тогда в каких случаях используются хуки? Имеется ввиду в чем их польза? на счет строки я и так без проблем пересылал текст, код ниже. SendMessage(hwnd,WM_GETTEXT ,(WPARAM)0,(LPARAM)"Hello World"); Вся загвоздка в том как с помощью хука можно воздействовать на контролы, на которые стандартными способами нельзя воздействовать. С вытаскиванием информации есть тонкости: если контрол стандартный и совместимый со старыми версиями Windows - то тут всё просто, через границу процесса можно слать любые сообщения. А вот у всяких TreeView так уже не получится, для управления деревом и другими продвинутыми контролами придётся подвешивать хук, чтобы внедряться в адресное пространство нужного процесса, и уже отдавая команды хуку, дёргать необходимые контролы. Про кастомные контролы вообще сложно что-то сказать - если программа, которой нужно управлять, такие имеет, то потребуется знание о том, как они работают и на какие сообщения реагируют. цитата принадлежит Ваду (Ответ №5)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #70 : 20-04-2010 17:20 » |
|
Hadron, ну так Вад и расскажет Хук ставится для возможности перехватывать сообщения, идущие к окну (то есть, можно сообщения передать дальше не меняя, а можно и поменять, либо просто логгировать, снифить и так далее). А отправлять сообщения можно без хука. Наверное, Вад имеет в виду как раз случай, когда хочется менять поведение того же TreeView "на лету"
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #71 : 21-04-2010 08:33 » |
|
Наверное, Вад имеет в виду как раз случай, когда хочется менять поведение того же TreeView "на лету"
Я имею в виду, что ты не можешь через границу процесса сказать дереву "развернись" или "вставь узел туда-то". То есть, отправить сообщение можешь, но эффекта никакого не будет. Поэтому на процесс вешается хук, который может получать сообщения от внешнего процесса (это, вообще говоря, возможно даже с помощью оконных сообщений - например, для WM_USER + X через границу процесса всё прекрасно ходит), и ретранслировать их в нужный элемент нужного окна. Советую Рихтера почитать - у него эта тема, насколько я помню, хорошо освещалась.
|
|
« Последнее редактирование: 21-04-2010 08:35 от Вад »
|
Записан
|
|
|
|
Hadron
Участник
Offline
|
|
« Ответ #72 : 23-04-2010 15:43 » |
|
Спасибо за пояснения Будем разбираться.
|
|
|
Записан
|
|
|
|
|