Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
1

Что-то я хук не могу осилить...

16.03.2011, 17:13. Просмотров 2283. Ответов 3
Метки нет (Все метки)

Раньше ни когда не пробовал работать с хуками (и с DLL тоже), но тут возникла необходимость поставить хук на WM_MOUSEMOVE и WM_MOUSEACTIVATE для одного конкретного процесса. Прочитал несколько статей в инете про DLL и хуки, ну думаю - сейчас сяду и все напишу, но не тут то было...
В общем вот код DLL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<Windows.h>
HINSTANCE hInstance=NULL;
HHOOK hHook=NULL;
/**************************************************************** 
  WH_GETMESSAGE hook procedure 
 ****************************************************************/ 
 BOOL _stdcall DllMain(HINSTANCE hInst, DWORD Reason, LPVOID reserved){
  if(Reason==DLL_PROCESS_ATTACH)
       hInstance = hInst;
       return true;
}
extern "C" __declspec(dllexport) 
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) { 
    if(nCode>0&&((MSG*)lParam)->message==WM_MOUSEMOVE)
        return 0;
           return CallNextHookEx(NULL,nCode,wParam,lParam);
} 
extern "C" __declspec(dllexport)
bool InstallHook(DWORD ThreadID){
    hHook=SetWindowsHookEx(WH_GETMESSAGE,HookProc,hInstance,ThreadID);
    return hHook ? true:false;
}
extern "C" __declspec(dllexport)
void UninstallHook(){
    UnhookWindowsHookEx(hHook);
}
DLL создаю так: в MSVS проект Win32, там выделяю "Библиотека DLL". При сборке проекта у меня получаются фалы .pdb, .lib, .exp и .dll.
Далее все эти файлы копирую в папку со своим проектом - прога, из которой буду ставить хук.
Там добавил такие строки:
C++
1
2
3
4
HMODULE hLib = LoadLibrary("MouseHook.dll");
FARPROC InstHook=GetProcAddress(hLib,"InstallHook");//пробовал в аргументе писать "_InstallHook",
                                                                        //но тогда возвращается 0
InstHook(GetWindowThreadProcessId(hGame,NULL));//hGame - хендл нужного окна.
Это даже не компилится, VS подчеркивает последнюю строку и пишет "слишком много аргуменов".
Пробовал сделать по разному, чтоб добится компилсяции, но работать это не стало.
Подскажите, что я делаю не так?

Еще в статьях в инете часто упомянается файл .DEF (для бибилиотеки), у меня его нет, может в этом проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2011, 17:13
Ответы с готовыми решениями:

Не могу осилить STP16CP05
всем привет, прошу помощи разобраться с STP16CP05... Предыстория такова:...

Не могу осилить условия!
Добрый вечер! Подскажите, почему не работает должным образом условие: Ставил...

Не могу осилить алгоритм проги
Радисту назначены два сеанса связи продолжительностью T1 и T2 соответственно....

Не могу осилить std::cout
Подскажите плз, почему у меня может не работать cout и std::cout. Пробую в...

Логическая задача.Не могу осилить
Дана задача: По подозрению в совершенном преступлении задержали Брауна,Джона и...

3
bobrovskii
59 / 59 / 2
Регистрация: 22.01.2011
Сообщений: 187
16.03.2011, 20:56 2
Kastaneda,
C
1
2
3
4
5
6
7
typedef BOOL (*InstallHook)(DWORD ThreadID);
void load_and_call(void) {
    HMODULE hmod = LoadLibrary(...);
    InstallHook func =  (InstallHook)GetProcAddress(hmod, "InstallHook");
    func(ThreadID);
    FreeLibrary(...);
}
у меня примерно такой код работал.
2
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
17.03.2011, 14:57  [ТС] 3

Не по теме:

Завтра уже попробую, спать пошел...
Но у меня есть ощущение, что я с DLL'кой напартачил, но не могу понять где.



Добавлено через 17 часов 58 минут
bobrovskii, да, все дело было именно в этом) Просто вчера зациклился в другом месте, не там ошибку искал.
Теперь другая проблема, WM_MOUSEMOVE не игнорируется, как было задуманно, но с этим разберусь)
0
Whatson
9 / 9 / 0
Регистрация: 18.11.2011
Сообщений: 55
28.03.2013, 12:40 4
Хорошо, всё круто, всё работает после лёгкого допиливания
Но, почему
SetWindowsHookEx(WH_MOUSE, HookProc, NULL, ThreadID);
возвращает NULL даже если ThreadID = 0 (ловим все thread-ы нашей проги)?

Добавлено через 2 часа 25 минут
Вроде разобрался, надо из приложения вызывать ThreadID = GetCurrentThreadId(); и передавать его в библиотеку...
В библиотеке при вызове SetWindowsHookEx(WH_MOUSE, HookProc, NULL, ThreadID) возвращается тогда handle функции HookProc. Приводим его к нужному типу и вперёд дёргать!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2013, 12:40

не могу осилить два примера...
Помогите дорешать контрольную, осталось два задания: 1) Имеется массив А из...

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

Не могу осилить метод Ньютона
Доброго времени суток, помогите пожалуйста, справиться с уравнением, которое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru