Russian Qt Forum
Март 28, 2024, 12:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: События перемещения мыши  (Прочитано 18023 раз)
virtual_root
Гость
« : Июль 02, 2012, 13:34 »

Добрый день. Ребята подскажите,пожалуйста, как мне решить следующую задачу:
Требуется ловить события перемещения мыши вне моей программы. Не по таймеру, а каждое перемещение отлавливать и вызывать соответствующую функцию. Может в QT есть решения для этого,чтобы WinAPI не использовать?
Записан
Bepec
Гость
« Ответ #1 : Июль 02, 2012, 13:39 »

Это платформо зависимый код нужен.
Qt это вроде как не позволяет, кроме как таймером.

И вообще - чем тебе winApi ненравится???
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Июль 02, 2012, 14:04 »

только через платформо-зависимый код
Записан
virtual_root
Гость
« Ответ #3 : Июль 03, 2012, 09:25 »

А может вы подскажите как это через winAPI реализовать? С помощью хуков не подходит, так как попросили без перехвата мыши...
Я читала что можно через системные события сделать. Кто-нибудь работал с системными событиями, можете,пожалуйста, подсказать, как с ними работать.
« Последнее редактирование: Июль 03, 2012, 09:31 от virtual_root » Записан
Bepec
Гость
« Ответ #4 : Июль 03, 2012, 09:35 »

Уважаемый. Как вы собираетесь ПЕРЕХВАТЫВАТЬ события передвижения мыши, БЕЗ ПЕРЕХВАТА событий мыши?
Записан
virtual_root
Гость
« Ответ #5 : Июль 03, 2012, 09:49 »

мне нужно как-бы подписаться на это событие. Завести соответствующее событие в системе и ловить, а как мне это сделать?
Я наверное чего-то не понимаю. Для создания события в windows я использую:
Код:
event = CreateEvent( NULL, FALSE, FALSE, NULL );
А где мне указать что меня интересует событие перемещения мыши, чтобы можно было допутим в бесконечном цикле его ожидать?
« Последнее редактирование: Июль 03, 2012, 09:56 от virtual_root » Записан
Bepec
Гость
« Ответ #6 : Июль 03, 2012, 10:06 »

Кхм... Вы походу многое путаете...
Чтобы перехватить событие нужен хук.
КреатеЕвент - создаёт событие. Не перехватывает, не изменяет, не подписывается, а создаёт.

Вы или многого не понимаете, или знаете что-то о чём незнаю я (ну и заодно со мной msdn Веселый)
Записан
virtual_root
Гость
« Ответ #7 : Июль 03, 2012, 10:24 »

Верес, помогите мне пожалуйста разобраться!) Как мне получать событие перемещения мыши без её перехвата? Или это попросту не возможно? Я думала, что нужно просто подписаться на это событие,правда не знаю как...) в гугле что-то не могу найти похожего решения, только с хуками.
Записан
Bepec
Гость
« Ответ #8 : Июль 03, 2012, 10:42 »

Уважаемый. Как вы собираетесь ПЕРЕХВАТЫВАТЬ события передвижения мыши, БЕЗ ПЕРЕХВАТА событий мыши?

Прочитайте слова, выделенные синим Улыбающийся Если они вас не смутят, тогда вы аки бог.

Чтобы получать события мыши - нужно поставить хук. В вашем случае нужен глобальный хук.

Хук - это как раз функция, которая вызывается при перехвате событий, указанных в её параметрах(ну при инициализации).
Собственно хук вам и нужен.

А "Строить не строя" и "Ломать не ломая" - это уже к всевышнему. Он такие чудеса может делать Улыбающийся
« Последнее редактирование: Июль 03, 2012, 11:56 от Bepec » Записан
virtual_root
Гость
« Ответ #9 : Июль 03, 2012, 10:49 »

спасибо большое!)
Записан
virtual_root
Гость
« Ответ #10 : Июль 03, 2012, 12:45 »

Ребята, помогите, кто знает разобраться с хуками.
Мне нужно создать хук, который перехватывает событие перемещения мыши вне области программы.
Почитав на форумах и в msdn, я написала следующий код:
dll библиотека, в которой содержится фун-я обработчик события для хука:
файл .h:
Код:
#ifndef HOOKFUNCTIONS_H
#define HOOKFUNCTIONS_H

#include "hookFunctions_global.h"


class HOOKFUNCTIONSSHARED_EXPORT HookFunctions {
public:
    int cxPoint;
    int cyPoint;
    HookFunctions();
    LRESULT CALLBACK MouseHook(int nCode,WPARAM wParam,LPARAM lParam);
    int x();
    int y();
    FILE *file;
    long buffer[100];
    int numwritten;

};

#endif // HOOKFUNCTIONS_H

файл .cpp:
Код:
#include "hookfunctions.h"


HookFunctions::HookFunctions()
{
}
 // функция-фильтр, которая обрабатывает наш хук.
LRESULT CALLBACK HookFunctions::MouseHook(int nCode,WPARAM wParam,LPARAM lParam)
{
 if((HC_ACTION == nCode))
 {
     cxPoint = LOWORD(lParam);  // извлекаем младший байт, это и есть координата х мыши
     cyPoint = HIWORD(lParam); // извлекаем старший байт, это и есть координата у мыши
     if (fopen("test.txt","a+")){
         numwritten = fwrite((char *)buffer, sizeof(long), 100,file);
         fclose(file);
     }
 }
 return CallNextHookEx(0, nCode, wParam, lParam);
}

int HookFunctions::x(){
    return cxPoint;
}

int HookFunctions::y(){
    return cyPoint;
}

файл main.cpp в котором я и создаю хук:
Код:
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
  
    HOOKPROC hkprcSysMsg;
    static HINSTANCE hinstDLL;
    static HHOOK hhookSysMsg;

    hinstDLL = LoadLibrary(TEXT("hookFunctions.dll"));
    hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "MouseHook"); // MouseHook функция из библиотеки

    hhookSysMsg = SetWindowsHookEx(
                        WH_MOUSE,
                        hkprcSysMsg,
                        hinstDLL,
                        0);

    return 0;
}

Получается, что в функции обработчике в библиотеки я записываю координаты курсора в файл. Но ничего не записывается! Помогите, пожалуйста.  Возможно как-то получать эти координаты из библиотеки в основной программе, не записывая их в файл?
Записан
Bepec
Гость
« Ответ #11 : Июль 03, 2012, 13:14 »

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

Даже не так - вообще не понимаю Веселый И мейн у вас закрывается мгновенно, не так ли?
А то, что функция для хука у вас в классе - ну незнаю. Никогда так не делал Веселый
И функция в dll у вас не экспортирована похоже...

Что сказать - эммм... откуда вы это содрали? Веселый
Записан
virtual_root
Гость
« Ответ #12 : Июль 03, 2012, 13:37 »

Вы не поверите, не откуда, сама написала. Я совсем запуталась с этими хуками. Просто прочла в msdn и здесь http://www.rsdn.ru/article/baseserv/apicallsintercepting.xml
И как мне показалось что нужно обязательно dll-ку делать. Если можно без неё я буду счастлива, только как это сделать? Я просто создала консольный проектик, чтоб поучиться работать с хуками.
Переписала код так:
Код:
#include <iostream>
#include <windows.h>


using namespace std;
LRESULT CALLBACK MouseHook(int nCode, WPARAM wParam, LPARAM lParam)
{
    int x = LOWORD(lParam);  // извлекаем младший байт, это и есть координата х мыши
    int y = HIWORD(lParam); // извлекаем старший байт, это и есть координата у мыши
    cout<< x <<y;
    return 0;
}
int main()
{
    static HHOOK hhookSysMsg;

    hhookSysMsg = SetWindowsHookEx(WH_MOUSE,MouseHook,GetModuleHandle(NULL),0);

    return 0;
}
Проект собирается, но результата никакого. Координаты мыши в консоль не выводятся...
Что я не так снова сделала?  Улыбающийся
Может нужно вместо WH_MOUSE что-то другое указать, чтобы отлавливать перемещения мыши ?
« Последнее редактирование: Июль 03, 2012, 13:42 от virtual_root » Записан
Bepec
Гость
« Ответ #13 : Июль 03, 2012, 13:41 »

Ожидайте ответа через ммм... 15-20 минут. Не раньше )
Записан
virtual_root
Гость
« Ответ #14 : Июль 03, 2012, 13:46 »

буду ждать) спасибо вам за терпение)) Улыбающийся
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 22.