Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Kastaneda
Jesus loves me
Эксперт С++
4688 / 2892 / 236
Регистрация: 12.12.2009
Сообщений: 7,353
Записей в блоге: 2
Завершенные тесты: 1
#1

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

16.03.2011, 17:13. Просмотров 2046. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что-то я хук не могу осилить... (C++ WinAPI):

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

не могу осилить два примера... - Basic
Помогите дорешать контрольную, осталось два задания: 1) Имеется массив А из N произвольных чисел A(N), среди которых есть...

Не могу осилить std::cout - C++
Подскажите плз, почему у меня может не работать cout и std::cout. Пробую в Dev-C++ 5.11 #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Не могу осилить алгоритм проги - Delphi
Радисту назначены два сеанса связи продолжительностью T1 и T2 соответственно. За время этих сеансов требуется передать максимально ...

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

Логическая задача.Не могу осилить - Prolog
Дана задача: По подозрению в совершенном преступлении задержали Брауна,Джона и Смита.Один из них был уважаемым в городе стариком,другой...

3
bobrovskii
59 / 59 / 3
Регистрация: 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
Эксперт С++
4688 / 2892 / 236
Регистрация: 12.12.2009
Сообщений: 7,353
Записей в блоге: 2
Завершенные тесты: 1
17.03.2011, 14:57  [ТС] #3

Не по теме:

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



Добавлено через 17 часов 58 минут
bobrovskii, да, все дело было именно в этом) Просто вчера зациклился в другом месте, не там ошибку искал.
Теперь другая проблема, WM_MOUSEMOVE не игнорируется, как было задуманно, но с этим разберусь)
0
Whatson
9 / 9 / 2
Регистрация: 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
28.03.2013, 12:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2013, 12:40
Привет! Вот еще темы с ответами:

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

Не могу осилить Json "DBXJSON' - C++ Builder
Получаю Json строку: {&quot;error&quot;:{&quot;error_code&quot;:10,&quot;error_msg&quot;:&quot;Internal server error: could not get application&quot;,&quot;request_params&quot;:}} ...

3 легкие задачи, которые я никак не могу осилить - C++
Только начал изучать с++. Собственно, пока не могу справиться с некоторыми заданиями. Прошу написать и объяснить, как, куда и что...

Не могу осилить задачи на написание функций / JavaScript - JavaScript
Ребята! кто нибудь! прошу! помогите! уже не знаю что делать. дело в том, что я Вчера, 09:34 создал тему - Не могу решить задачи на...


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

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

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