Пишу на C++. Необходимо перехватывать сообщения WM_LBUTTONDOWN. Пытаюсь воспользоваться Hook'ами. Взял пример из MSDN, вырезал всё лишнее и получил следующий код. Код (Text): LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam) { printf("Сообщение от мыши"); return 0; } int _tmain(int argc, _TCHAR* argv[]) { HOOKPROC hkprcSysMsg; static HINSTANCE hinstDLL; static HHOOK hhookSysMsg; hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll"); hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "MouseProc"); hhookSysMsg = SetWindowsHookEx(WH_MOUSE,hkprcSysMsg,hinstDLL,0); getch();//бесконечный цикл ожидания } Но код не работает. Функция MouseProc никогда не вызывается. Пробовал вызывать SetWindowsHookEx следующим образом: Код (Text): SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,NULL); Не помогло.
В строчке hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll"); ошибка ERROR_MOD_NOT_FOUND 126 The specified module could not be found
ТО есть нужно создать dll, в которой будет храниться код функции MouseProc? А нельзя ли обойтись без этого?
При выполнении SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,NULL); возникает ошибка ERROR_HOOK_NEEDS_HMOD 1428 0x594 Cannot set nonlocal hook without a module handle. Почему?
Важная деталь относительно удаленных хуков: хук-пpоцедуpа должна находиться в DLL, котоpая будет пpомэппиpована в дpугой пpоцесс Простейший пример можно посмотреть у iczelion'a
Мне удалось создать dll и загрузить её, но не удается получить адрес моей функции в dll. Код (Text): #include "stdafx.h" #include <stdio.h> #ifdef _MANAGED #pragma managed(push, off) #endif BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } extern LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam ) { printf("ABC"); return 0; } #ifdef _MANAGED #pragma managed(pop) #endif Правильный ли код у dll? Функция GetProcAddress(hinstDLL, "MouseProc"); возвращает 0. Ошибка: не найдена функция.
Получилось загрузить dll. Код функции MouseProc Код (Text): if (wParam==WM_LBUTTONDOWN) { MessageBeep(0xffffffff); printf("ABC"); } При клике мышкой гудок есть, но в консоли ничего не выводится. Это и понятно: ведь dll про мою консоль ничего не знает! Изначально цель проекта заключалась в том, чтобы при нажатии на левую кнопку мыши выводился хендл окна, на котором стоит курсор. Но я не хочу выводить это в файл. Как сделать, чтобы все по-нормальному выводилось в мою консоль? Помогите, пожалуйста!
Самое простое - возвращать (передавать) строку вызывающему модулю, пускай он выводит. Можно попробовать поиграться с GetConsoleCP и т.п.
Полный код в студию, пожалуйста. А то пишите, пишите, и даже не дадите нормальный код, у меня не находит саму процедуру в библиотеке, не знаю как правильно объявить