0 / 0 / 0
Регистрация: 02.05.2011
Сообщений: 20
1

Системный хук на мышь

06.06.2011, 22:47. Показов 2710. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Помогите, пожалуйста, разобраться.

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

Код основной программы:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
////////////////////////////////////////////////////////////////////////////////
//Mouse.cpp
 
#include <stdafx.h>
#include <stdio.h>
#include <windows.h>
#include <zmouse.h>
#include "iostream"
#include <Setupapi.h>
#include <Lmcons.h>
#include <zmouse.h>                     
#include <math.h>                       
#pragma comment(lib, "user32.lib")     
#pragma comment(lib, "Advapi32.lib")
#pragma comment(lib, "Kernel32.lib") 
 
 
struct st
{
    double n1;
    double n2;
};
 
 
int main()
{
        
        HMODULE hLib;
        if ((hLib = LoadLibrary("dll-mouse-2.dll")) != NULL) {printf ("Good load DLL \n");}
        int (*pFunction)();
        int i = 0;
 
    while (true) {
        file=fopen(file_name, "a");
        (FARPROC &) pFunction= GetProcAddress(hLib, "MouseHookFunction");
 
        typedef double (*GETDOUBLEVAL)();
        typedef st (*GetSTVal)();
        st st_var;
        double d1, d2;
        
        GetSTVal ST_Val = (GetSTVal) GetProcAddress(hLib,"MouseHookFunction");
        if (ST_Val)
        {
            st_var = ST_Val();
            d1 = st_var.n1;
            d2 = st_var.n2;
        }
        
        char ttt_d1[100];
        sprintf(ttt_d1, "%f", d1);
        int len_ttt_d1=0;
        for (int unsigned j=0;j<strlen(ttt_d1);j++) {len_ttt_d1++;}
        printf("%s\n", ttt_d1);
    }
 
        FreeLibrary(hLib);
 
    return 0;
return 0;   }

Код 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
////////////////////////////////////////////////////////////////////////////////
//Mouse-dll.cpp
 
#include <iostream>
#include "stdafx.h"
#include <windows.h>
#include <Winuser.h>
#pragma comment(lib, "user32.lib")
 
struct st
{
    double n1;
    double n2;
};
 
extern "C" __declspec(dllexport) st MouseHookFunction();
extern "C" __declspec(dllexport)LRESULT CALLBACK WH_HookMouse(int code,WPARAM wParam,LPARAM lParam);
 
//==============================================================================
 
HHOOK HookHandle;
LRESULT CALLBACK WH_HookMouse(int nCode,WPARAM wParam,LPARAM lParam);
 
st n_st;
//==============================================================================
 
 
st MouseHookFunction()
{
    HookHandle = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)WH_HookMouse, 0, 0);
 
    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return n_st;
};
 
 
LRESULT CALLBACK WH_HookMouse(int code,WPARAM wParam,LPARAM lParam)
{       
    n_st.n1 = 0.1111;
    n_st.n2 = 0.2222;
 
    //обработка событий
        
    return CallNextHookEx(NULL, code, wParam, lParam);
}
Как я это вижу - из основной программы подгружается dll, в dll происходит перехват сообщений, меняются в структуре значения (координаты, время и т.п.), далее код возвращается в основную программу, где также получаются данные из структуры, происходят с ними определённые вычисления, запись в файл. Далее опять передаётся управлени dll, которая ловит сообщения от мыши и так в цикле.

Как есть - не могу правильно организовать цикл - у меня либо просто передаётся упраление в dll и управление обратно возвращается не долждавшись хука; либо передаётся управление в dll, но обратно не возвращается управление.

Как быть, как правильно организовать передачу упраления? Помогите, кто чем может))

Заранее спасибо)

Добавлено через 23 часа 2 минуты
Неужели никто не знает, или просто лень?)))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2011, 22:47
Ответы с готовыми решениями:

Хук на мышь из неглавного потока
Добрый день! Подскажите, пожалуйста: устанавливаю хук в методе Execute() моего потока. А дальше...

Глобальный Хук на Мышь
Возможно такое или придётся делать на др. языке? Если возможно, то как? Добавлено через 1 минуту...

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

Простой глобальный хук на мышь
Всем доброго времени суток. Дайте, пожалуйста, простой пример глобального хука на мышь для VB.Net ...

8
1 / 1 / 0
Регистрация: 26.07.2009
Сообщений: 15
08.06.2011, 17:42 2
Такой вопрос: а зачем тебе цикл обработки сообщений в dll? Если твой хук успешно прицепился к системе, то вся обработка сообщений, относящаяся к выбранному хуку происходит через функцию, которою ты указал в вызове SetWindowsHookEx. В твоем случае - WH_HookMouse().
0
0 / 0 / 0
Регистрация: 02.05.2011
Сообщений: 20
08.06.2011, 23:16  [ТС] 3
я такие цмклы видел в примерах - что б dll в памяти весела. А тут ещё проблема выяснилась - почему-то не ципляется к системе. Но вот тут мне совсем не помятно почему.
0
1 / 1 / 0
Регистрация: 26.07.2009
Сообщений: 15
08.06.2011, 23:47 4
DLL будет висеть в памяти, пока ты её не выгрузишь командой FreeLibrary() в твоем случае). А в чем выражается тот факт, что хук не в системе?
1
0 / 0 / 0
Регистрация: 02.05.2011
Сообщений: 20
09.06.2011, 00:04  [ТС] 5
Спасибо за подсказку с освобождением dll. У меня не понимаю тогда - хук будет висеть всегда в памяти и ловить все сообщения от мыши или это разавая процедура будет?

Я из основной программы подгружаю dll, в функции MouseHookFunction ставлю хук на мышь и двигаю мышью. По моей логике, должен сработать хук, управление должно перейти в LRESULT CALLBACK WH_HookMouse, там изменить значение n_st.n1 с 0.000000 на 0.111100. Далее я вызываю структуру n_st из основной программы и вывожу в консоль значение n_st.n1. И оно равно 0.000000.
0
1 / 1 / 0
Регистрация: 26.07.2009
Сообщений: 15
09.06.2011, 00:50 6
Ну всегда он висеть не будет. Вообще лучше создать отдельную функцию в dll, которая снимает функцию-фильтр ( у тебя фильтр - LRESULT CALLBACK WH_HookMouse) с хука и вызывать её либо планово в dll либо в случае что что-то не сработало уже в основной проге. А вообще для проверки как работает сам хук лучше сделай чтобы он возвращал не структуру, а скажем какой-нибудь флаг типа BOOL и проверяя TRUE и FALSE выяснить, что именно работает не так.
0
0 / 0 / 0
Регистрация: 02.05.2011
Сообщений: 20
12.06.2011, 17:34  [ТС] 7
Спасибо, вроде бы разобрался.

Но возник другой вопрос - написал вот такой код

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
LRESULT CALLBACK WH_HookMouse(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
//LRESULT CALLBACK WH_HookMouse(int code,WPARAM wParam,LPARAM lParam)
{       
    int len_ttt_1=0;
    int len_ttt_2=0;
        //n_st.n2 = 0.2222;
    switch(message)
    {
    case WM_LBUTTONDOWN:
        n_st.n1 = LOWORD(lParam);
        char ttt_1[100];
        sprintf(ttt_1, "%i", n_st.n1);
        for (int unsigned j=0;j<strlen(ttt_1);j++) {len_ttt_1++;}
        file=fopen(file_name, "a+");    
        fwrite(ttt_1,len_ttt_1,1,file);
        fwrite(newline,1,1,file);
        n_st.n1 = 0.000000;
        fclose(file);
        break;
 
    default: 
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    //CallNextHookEx(hHook, message, wParam, lParam)
}
Продблема в том, что при запуске программы выводтся одни и те же координаты мыши. В чём может быть проблема?
0
1 / 1 / 0
Регистрация: 26.07.2009
Сообщений: 15
15.06.2011, 21:58 8
Я недавно много экспериментировал с возможностью вывода действий хука. Так вот, в функции обработки хука лучше не записывать данные в файл, ибо когда ты цепляешь WH_GETMESSAGE, то длл многократно вызывает её, а запись в файл С-ными функциями происходит путем открытия файловых дескрипторов и без доп. синхронизации в лучшем случае у тебя просто не добавится инфа в файл. Передача сообщений окну из длл - честно выше моего понимания как это сделать, если только хук не цепляется к основному приложению. В общем, самый демократичный вариант - создание консоли из длл (AllocConsole) и простой вывод нужных данных.
0
0 / 0 / 0
Регистрация: 02.05.2011
Сообщений: 20
15.06.2011, 22:28  [ТС] 9
с этим ещё поразбираюсь. Но вот ещё проблема, которой вроде бы не должно быть - какие-то координаты странные: координата х, например, 64365, а y=70.
0
15.06.2011, 22:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2011, 22:28
Помогаю со студенческими работами здесь

Дополнить глобальный хук на мышь
У меня есть глобальный хук на мышь , но он срабатывает только на ЛКМ. Помогите дописать , чтобы он...

Глобальный хук на клавиатуру и мышь без dll
Все пытаюсь определить время простоя системы, ни один из вариантов не работате на 64 битной...

Глобальный хук на мышь - нужен наглядный пример
Хочу разобраться с глобальными хуками в vb на наглядном примере, не завалялось ли у кого нибудь...

Продам Компьютер (системный блок, монитор, мышь, клавиатура)
Продам компьютер (комплект): 1) Системный блок; 2) Монитор (LG L204WT-SF, 20.1&quot;, LCD, Wide,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru