Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 25.06.2016
Сообщений: 25

Проверка движения мыши с SetWindowsHookEx

14.08.2017, 14:58. Показов 2031. Ответов 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
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
class MouseHook 
{
public:
 
    static MouseHook& Instance() 
    {
        static MouseHook myHook;
        return myHook;
    }
 
    HHOOK hook;
    void InstallHook();
    void UninstallHook();
 
    MSG msg;
    void Messsages();
};
 
 
LRESULT WINAPI MyMouseCallback(int nCode, WPARAM wParam, LPARAM lParam) 
{
    MSLLHOOKSTRUCT * pMouseStruct = (MSLLHOOKSTRUCT *)lParam;
    if (!nCode) {
        if (pMouseStruct) {
            switch (wParam) {
 
            case WM_MOUSEMOVE:
 
                cout << "Мышь двигается\n";
 
                break;
            }
        }
        return CallNextHookEx(MouseHook::Instance().hook, nCode, wParam, lParam);
    }
}
 
 
void MouseHook::InstallHook() 
{
    SetWindowsHookEx(WH_MOUSE_LL, MyMouseCallback, NULL, 0);
}
 
void MouseHook::UninstallHook() 
{
    UnhookWindowsHookEx(hook);
}
 
void MouseHook::Messsages() 
{
    while (msg.message != WM_QUIT) {
        //Sleep(1);
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    UninstallHook();
}
 
void MouseHook()
{
    MouseHook::Instance().InstallHook();
    MouseHook::Instance().Messsages();
}
Вот собственно мой хук на мышь. Мне нужна максимально скоростная проверка на движения мышью, что обеспечить может только хук. GetCurPos слишком медленный для этого.
Так вот кейс WM_MOUSEMOVE срабатывает, если мышь двигается, НО еще мне нужно знать, когда мышь НЕ двигается. Если её не двигать, то функция MyMouseCallback вообще не задействуется. Вопрос заключается в следующем: как проверить состояние покоя мыши с помощью этого хука?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2017, 14:58
Ответы с готовыми решениями:

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

В рабочей части окна при движении мыши с нажатой левой клавишей мыши рисовать траекторию движения курсора мыши
В рабочей части окна при движении мыши с нажатой левой клавишей мыши рисовать траекторию движения курсора мыши.При нажатии правой клавиши...

Перехват движения мыши
Помогите советом пожалуйста. Есть некое купленное приложение, которое крутится на windows server 2008, код которого неизвестен и по сути...

7
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
15.08.2017, 07:28
Запомнить. При запуске ловишь текущее положение через GetCurPos, сохраняешь в калиту, хуком обновляешь. Сильно нужно, добавляешь timestamp последнего вызова хука.
0
1 / 1 / 0
Регистрация: 25.06.2016
Сообщений: 25
15.08.2017, 10:35  [ТС]
icpu, я не очень понял суть, у меня программа запускает поток, где циклически производит некоторые провреки, в какой момент времени мне нужно ловить GetCurPos?
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
15.08.2017, 10:47
SP1K3_CSGO, перед запуском цикла.

Добавлено через 1 минуту
Буквально, вызвал GetCurPos и следующей операцией повесил хук.
0
1 / 1 / 0
Регистрация: 25.06.2016
Сообщений: 25
15.08.2017, 10:48  [ТС]
icpu, Так я хук 1 раз вешаю за всё выполнение программы, а геткурпос мне нужно 100 раз в секунду проверять.
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
15.08.2017, 11:27
SP1K3_CSGO, вам нужно сохранять состояние. Грубо, должен быть подобный код:

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
class MouseHook 
{
public:
    static MouseHook& Instance() 
    {
        static MouseHook myHook;
        return myHook;
    }
    static POINT point() 
    {
        return m_point;
    }
 
    MSG msg;
    HHOOK hook;
    static POINT m_point = {0};
    void Messsages();
    void InstallHook();
    void UninstallHook();
 
    friend LRESULT WINAPI MyMouseCallback(int nCode, WPARAM wParam, LPARAM lParam);
};
 
LRESULT WINAPI MyMouseCallback(int nCode, WPARAM wParam, LPARAM lParam) 
{
    MSLLHOOKSTRUCT * pMouseStruct = (MSLLHOOKSTRUCT *)lParam;
    if (!nCode) {
        if (pMouseStruct) {
            switch (wParam) {
            case WM_MOUSEMOVE:
                MouseHook::m_point = pMouseStruct->pt;
                break;
            }
        }
        return CallNextHookEx(MouseHook::Instance().hook, nCode, wParam, lParam);
    }
}
 
 
void MouseHook::InstallHook() 
{
    GetCursorPos(&MouseHook::m_point);
    SetWindowsHookEx(WH_MOUSE_LL, MyMouseCallback, NULL, 0);
}
 
void MouseHook::UninstallHook() 
{
    UnhookWindowsHookEx(hook);
}
 
void MouseHook::Messsages() 
{
    while (msg.message != WM_QUIT) {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    UninstallHook();
}
 
void MouseHook()
{
    MouseHook::Instance().InstallHook();
    MouseHook::Instance().Messsages();
}
Добавлено через 11 минут
А если нужно именно состояние (подвижна/неподвижна), то

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
/* ... */
    static POINT m_point = {0};
    static time_t last_update;
    static bool is_static = false;
/* ... */
    static bool isStaticPosition() 
    {
        if (!is_static) {
            is_static = time(0) - last_update >= 10 /*ms ~100FPS*/;
        }
        return is_static;
    }
/* ... */
            case WM_MOUSEMOVE:
                MouseHook::m_point = pMouseStruct->pt;
                last_update = time(0);
                is_static = false
/* ... */
void MouseHook::InstallHook() 
{
    GetCursorPos(&MouseHook::m_point);
    last_update = 0;
    is_static = true;
    SetWindowsHookEx(WH_MOUSE_LL, MyMouseCallback, NULL, 0);
}
Добавлено через 11 минут
Вместо time(0) можно использовать время из структуры, но тогда нужно использовать тот же способ обновления информации о времени, что и в недрах винды, что проблематично. А смешивать разные источники - крайне неразумно.
Чуть не забыл, для чисто движения понадобится:
C++
1
2
if (MouseHook::m_point == pMouseStruct->pt) break;
MouseHook::m_point = pMouseStruct->pt;
0
1 / 1 / 0
Регистрация: 25.06.2016
Сообщений: 25
15.08.2017, 11:29  [ТС]
Цитата Сообщение от icpu Посмотреть сообщение
10 /*ms ~100FPS*/;
спасибо большое за код, сейчас буду пробовать, но про сто раз в секунду то я образно сказал
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
15.08.2017, 13:06
Цитата Сообщение от SP1K3_CSGO Посмотреть сообщение
но про сто раз в секунду то я образно сказал
Это не про число проверок, это про плавность движения. Чем меньше величина, тем лучше замечаешь паузы и рывки в движении курсора. Если делаешь капчу - это полезно. А если реализуешь, условно, Drag'n'Drop, то будет мешать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2017, 13:06
Помогаю со студенческими работами здесь

След движения мыши
Создать приложение, в котором выводится след движения мыши. WIndows Forms Application!

Траектория движения мыши
Вообщем такая проблемка.Мне нужно по заданию,при движении курсора,рисовалась линия(траектория) и по нажатию горячей клавиши с клавиатуры...

Имитация движения мыши
Пишу функцию движения мыши mousemove(x,y) следующим образом: tmo = y-rc.top; nNCHitTest=SendMessage(hWnd,...

След движения мыши
Подскажите, пожалуйста, как сделать именно след движения мыши при вождении курсором по форме? У меня получилось только рисовать линию при...

[Cocos2d-x] Регистрация движения мыши
Всем привет. Пишу на cocos2d (python). Столкнулся с одной проблемой. Есть класс в котором прописано движение спрайта - по нажатию клавиш...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru