Russian Qt Forum
Март 28, 2024, 12:03
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
События перемещения мыши
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: События перемещения мыши (Прочитано 18023 раз)
virtual_root
Гость
События перемещения мыши
«
:
Июль 02, 2012, 13:34 »
Добрый день. Ребята подскажите,пожалуйста, как мне решить следующую задачу:
Требуется ловить события перемещения мыши
вне
моей программы. Не по таймеру, а каждое перемещение отлавливать и вызывать соответствующую функцию. Может в QT есть решения для этого,чтобы WinAPI не использовать?
Записан
Bepec
Гость
Re: События перемещения мыши
«
Ответ #1 :
Июль 02, 2012, 13:39 »
Это платформо зависимый код нужен.
Qt это вроде как не позволяет, кроме как таймером.
И вообще - чем тебе winApi ненравится???
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: События перемещения мыши
«
Ответ #2 :
Июль 02, 2012, 14:04 »
только через платформо-зависимый код
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #3 :
Июль 03, 2012, 09:25 »
А может вы подскажите как это через winAPI реализовать? С помощью хуков не подходит, так как попросили без перехвата мыши...
Я читала что можно через системные события сделать. Кто-нибудь работал с системными событиями, можете,пожалуйста, подсказать, как с ними работать.
«
Последнее редактирование: Июль 03, 2012, 09:31 от virtual_root
»
Записан
Bepec
Гость
Re: События перемещения мыши
«
Ответ #4 :
Июль 03, 2012, 09:35 »
Уважаемый. Как вы собираетесь ПЕРЕХВАТЫВАТЬ события передвижения мыши, БЕЗ ПЕРЕХВАТА событий мыши?
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #5 :
Июль 03, 2012, 09:49 »
мне нужно как-бы подписаться на это событие. Завести соответствующее событие в системе и ловить, а как мне это сделать?
Я наверное чего-то не понимаю. Для создания события в windows я использую:
Код:
event = CreateEvent( NULL, FALSE, FALSE, NULL );
А где мне указать что меня интересует событие перемещения мыши, чтобы можно было допутим в бесконечном цикле его ожидать?
«
Последнее редактирование: Июль 03, 2012, 09:56 от virtual_root
»
Записан
Bepec
Гость
Re: События перемещения мыши
«
Ответ #6 :
Июль 03, 2012, 10:06 »
Кхм... Вы походу многое путаете...
Чтобы перехватить событие нужен хук.
КреатеЕвент - создаёт событие. Не перехватывает, не изменяет, не подписывается, а создаёт.
Вы или многого не понимаете, или знаете что-то о чём незнаю я (ну и заодно со мной msdn
)
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #7 :
Июль 03, 2012, 10:24 »
Верес, помогите мне пожалуйста разобраться!) Как мне получать событие перемещения мыши без её перехвата? Или это попросту не возможно? Я думала, что нужно просто подписаться на это событие,правда не знаю как...) в гугле что-то не могу найти похожего решения, только с хуками.
Записан
Bepec
Гость
Re: События перемещения мыши
«
Ответ #8 :
Июль 03, 2012, 10:42 »
Цитата: Bepec от Июль 03, 2012, 09:35
Уважаемый. Как вы собираетесь
ПЕРЕХВАТЫВАТЬ
события передвижения мыши,
БЕЗ ПЕРЕХВАТА
событий мыши?
Прочитайте слова, выделенные синим
Если они вас не смутят, тогда вы аки бог.
Чтобы получать события мыши - нужно поставить хук. В вашем случае нужен глобальный хук.
Хук - это как раз функция, которая вызывается при перехвате событий, указанных в её параметрах(ну при инициализации).
Собственно хук вам и нужен.
А "Строить не строя" и "Ломать не ломая" - это уже к всевышнему. Он такие чудеса может делать
«
Последнее редактирование: Июль 03, 2012, 11:56 от Bepec
»
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #9 :
Июль 03, 2012, 10:49 »
спасибо большое!)
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #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
Гость
Re: События перемещения мыши
«
Ответ #11 :
Июль 03, 2012, 13:14 »
Да можно.
Вот только что вы тут творите я не очень понимаю
Даже не так - вообще не понимаю
И мейн у вас закрывается мгновенно, не так ли?
А то, что функция для хука у вас в классе - ну незнаю. Никогда так не делал
И функция в dll у вас не экспортирована похоже...
Что сказать - эммм... откуда вы это содрали?
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #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
Гость
Re: События перемещения мыши
«
Ответ #13 :
Июль 03, 2012, 13:41 »
Ожидайте ответа через ммм... 15-20 минут. Не раньше )
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #14 :
Июль 03, 2012, 13:46 »
буду ждать) спасибо вам за терпение))
Записан
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...