238 / 237 / 142
Регистрация: 03.02.2011
Сообщений: 1,437
1

Создание библиотеки. Mouse and keyboard hooks

23.01.2016, 18:54. Показов 1166. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хочу написать программу, которая будет логировать время работы пользователя над одним таском. Весь UI, запись в базу, выбор тасов и т.д. будет написан на Java. Нужны методы на С/С++ которые будут, следить за активность.
Идея такая:
1) Есть какая-то глобальная переменная, которой будет присваиваться дата и время последнего действия пользователя (использование мыши или клавы);
2) Из Java, каждую минуту будет вызываться нативный метод С/С++ который будет возвращать значения переменной из пункта 1, в зависимости от разницы, будет логироваться время.

Нa Java, для меня всё просто, там работы на 10-30 минут. Но вот с C/C++ сложнее. С/C++ был в университете, просто лёгкое прикосновение.
Так вот вопрос, как осуществить первый пункт? На выходе должен быть dll который я буду вызывать из Java. Я ради эксперимента попробовал вызывать метод, который просто будет получать из C/C++ текущую дату и время. Как определить глобальную переменную которой будет присваиваться это значение? Ибо в том что я пробовал, не пахнет какими-то переменными вне метода.
Мысль такая, использовать уже готовый код (ниже листинг) Добавить туда метод который будет вызывать из Java, создать 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "stdafx.h"
#include "KeyBoardHookLib.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
 
#pragma data_seg(".SHARE")
UINT UWN_KEYSTROKE;
 
HWND hWndServer = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.SHARE,rws")
HINSTANCE hInst;
HHOOK hook=NULL;
 
static LRESULT CALLBACK KeyBoardMsgProc( int nCode, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK LowLevelKeyBoardMsgProc( int nCode, WPARAM wParam, LPARAM lParam);
 
BOOL APIENTRY DllMain( HINSTANCE hModule, 
                       DWORD  dwReason, 
                       LPVOID lpReserved
                     )
{
    switch( dwReason )
    {
         case DLL_PROCESS_ATTACH:
            UWN_KEYSTROKE = ::RegisterWindowMessage(UWM_KEYBOARD_MSG);
            hInst = hModule;
            break;
    }
    return TRUE;
}
 
static LRESULT CALLBACK KeyBoardMsgProc( int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode < 0)
    { 
        CallNextHookEx(hook, nCode, wParam, lParam);
        return 0;
    }
    if (((DWORD)lParam & 0x40000000) &&(HC_ACTION==nCode))
    {       
        if (( wParam>=VK_LBUTTON )&&( wParam<=VK_OEM_CLEAR ) )
        {
            LPMSG msg = (LPMSG)lParam;
            PostMessage( hWndServer, UWN_KEYSTROKE, wParam, lParam );
        }
        else
        {
            PostMessage( hWndServer, UWN_KEYSTROKE, wParam, lParam );
        }
    }
    return CallNextHookEx(hook, nCode, wParam, lParam);
}
 
static LRESULT CALLBACK LowLevelKeyBoardMsgProc( int nCode, WPARAM wParam, LPARAM lParam)
{
}
 
__declspec(dllexport)  BOOL InstallKeyBoardHook( HWND hWndParent )
{
    if(hWndServer != NULL)
    return FALSE; // already hooked!
    hook = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)KeyBoardMsgProc, 
                             hInst, 0);
    if(hook != NULL)
    { 
        hWndServer = hWndParent;
        return TRUE;
    } 
    return FALSE;
}
 
__declspec(dllexport) BOOL UnInstallKeyBoardHook( HWND hWndParent )
{
     if(hWndParent != hWndServer || hWndParent == NULL)
    return FALSE;
     BOOL unhooked = UnhookWindowsHookEx(hook);
     if(unhooked)
    hWndServer = NULL;
     return unhooked;
    return TRUE;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2016, 18:54
Ответы с готовыми решениями:

Mouse/Keyboard hook
Для хуков мышки и клавиатуры исподьзую SetWindowsHooksEx при работе из под обычного Win32...

USB keyboard and mouse
Добрый вечер, господа. Пытаюсь, установить на комп на 1150 сокете с UEFI windows 7. Хочу поставить...

SilverCrest 2.4 GHZ Wireless Keyboard & Mouse
Здравствуйте, Купил в Лондоне беспроводную мышку и клавиатуру в одном комплекте SilverCrest 2.4...

Прочитать состояние линии интерфейса клавиатуры KEYBOARD CLOCK і KEYBOARD DATA
Прочитать состояние линии интерфейса клавиатуры KEYBOARD CLOCK і KEYBOARD DATA. Результат вивести...

2
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
23.01.2016, 18:58 2
Вместо хуков для отслеживания активности лучше GetLastInputInfo.
0
238 / 237 / 142
Регистрация: 03.02.2011
Сообщений: 1,437
23.01.2016, 19:00  [ТС] 3
Идея хуков была для кроссплатформенности, то есть Java уже кроссплатформенная, везде пойдёт. Про хуки читал что тоже можно сделать разные, чтоб на разных ОСях запускались, просто Java, будет в зависимости от ОС правильную либу подгружать.
0
23.01.2016, 19:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2016, 19:00
Помогаю со студенческими работами здесь

Создание dll библиотеки в C#. Вызов классов этой библиотеки
мне нужно как то создать динамическую библиотеку класов в си шарп, основой этой библиотеки должен...

Не запускается ПК. Ошибка "Bios rom checksum eror keyboard eror or no keyboard present"
после запуска ПК,выдает следующее:Bios rom checksum eror keyboard eror or no keyboard present....

How can I resize a picture when I move a move a mouse on it, and size it back when I move mouse out?
How can I resize a picture when I move a move a mouse on it, and size it back when I move mouse...

Windows Hooks на C#
Добрый день. В интернете нашел множество статей с подробным описанием и примерами установки...


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

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

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