Russian Qt Forum
Март 28, 2024, 11:45
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
События перемещения мыши
Страниц:
1
[
2
]
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: События перемещения мыши (Прочитано 18022 раз)
Bepec
Гость
Re: События перемещения мыши
«
Ответ #15 :
Июль 03, 2012, 14:34 »
Это код устанавливающий хук.
Код:
/*static HINSTANCE hLib;
static HHOOK hHook;*/
HOOKPROC hProc = NULL;
hLib = LoadLibrary("keyhook");
_ASSERTE(hLib);
hProc = (HOOKPROC)GetProcAddress(hLib, "HookProcMouse");
_ASSERTE(hProc);
hHook = SetWindowsHookEx(WH_MOUSE, hProc, hLib, NULL);
_ASSERTE(hHook);
Файл библиотечки (у меня dl.cpp)
Код:
#include "stdafx.h"
#include <atltypes.h>
#include <fstream>
#define __GLOBAL_HOOK
extern "C" __declspec(dllexport)
LRESULT CALLBACK HookProcMouse(int nCode, WPARAM wParam, LPARAM lParam)
{
// если сообщение не удалено из очереди(не особо заморачивайтесь по этому поводу)
if (nCode != HC_ACTION )
return CallNextHookEx(NULL, nCode, wParam, lParam);
// Если событие передвижения мыши
if (wParam == WM_MOUSEMOVE)
{
// то получаем указатель на структуру
MOUSEHOOKSTRUCT *tmp = (MOUSEHOOKSTRUCT*)lParam;
// открываем файл для записи, записываем и закрываем(координаты x и y)
std::ofstream out("c:/123", std::ios::app);
out << xs << tmp->pt.x << tmp->pt.y << std::endl;
out.close();
}
else
{
// иначе если сообщение другого типа, создаём 321, пишем, закрываем
std::ofstream out("c:/321", std::ios::app);
char xs = wParam;
out << xs << std::endl;
out.close();
}
// передаём следующему хуку по цепочке(не вашим хукам, а уже чужим)
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
Деф файл dl.def - он позволяет задать точные имена экспортируемым функциям. Если его не будет, название ф-ции будет что-то типа 1@HookProcMouse1@2 рандомно.
Код:
LIBRARY
"dl"
DESCRIPTION 'keyhook Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
HookProcMouse
В принципе и всё )
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #16 :
Июль 03, 2012, 15:16 »
спасибо большое, сейчас буду пробовать к себе в qt это всё применить.
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #17 :
Июль 04, 2012, 10:25 »
Верес, подскажите мне ещё разок пожалуйста. Я сделала снова библиотеку как у вас. Но я не знаю как мне в Qt .def файл привязать к библиотеки, как это сделать? У меня проект вылетает с ошибкой на assert(hProc). Я так понимаю это он не может найти функцию?
и ещё мне пришлось так заменить строку с подключением библиотеки:
Код:
hLib = LoadLibrary(L"libMouseAPI");
Ну думаю это ничего не меняет? Сам dll файл лежит рядом с .exe файлом программы где я подключаю его.
«
Последнее редактирование: Июль 04, 2012, 10:28 от virtual_root
»
Записан
Bepec
Гость
Re: События перемещения мыши
«
Ответ #18 :
Июль 04, 2012, 10:48 »
LoadLibrary загружает библиотеку из файла с названием, которое вы укажете
Название должно совпадать с названием dll.
hProc выдаёт ассерт - значит у вас не находится функция, экспортируемая из dll.
Откройте тоталкоммандер и нажмите ф3 на вашей dll. Там должна вкладочка быть import/export. В нижнем поле указано будет название вашей функции. Если def не подцепился, то оно будет отличаться от заданного в программе.
Если нет Тотала, то dependency walker вам в помощь.
Почитать про деф файл:
http://msdn.microsoft.com/ru-ru/library/d91k01sh.aspx
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #19 :
Июль 04, 2012, 12:32 »
У меня ничего не выходит.. уже два дня бьюсь над ней..
Переписала в таком виде:
Код:
#include <QtCore/QCoreApplication>
#include <windows.h>
#include <assert.h>
#include <cassert>
#include <QLibrary>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QLibrary myLib("./libMouseAPI");
myLib.load();
myLib.loadHints();
if (!myLib.isLoaded())
exit(0);
typedef LRESULT CALLBACK (*MyPrototype)(int, WPARAM, LPARAM);
MyPrototype myFunction = (MyPrototype) myLib.resolve("HookProcMouse");
if (!myFunction)
exit(0);
static HHOOK hHook;
hHook = SetWindowsHookEx(WH_MOUSE, myFunction, GetModuleHandle(NULL), NULL);
assert(hHook);
return a.exec();
}
Проверила под дебагом, библиотека загружается, фун-ю видит, но когда запускаю падаю в
Код:
assert(hHook);
Наверное я что-то неправильно указываю в фун-и:
Код:
SetWindowsHookEx(WH_MOUSE, myFunction, GetModuleHandle(NULL), NULL);
Как мне её правильно оформить, чтобы она принимала мой указатель на функцию?
И ещё вопросик, Верес, вы не подскажите, а можно как-то без dll обойтись всё в одном файле сделать?
И то что у меня консольный проект не играет никакой роли?
Записан
Bepec
Гость
Re: События перемещения мыши
«
Ответ #20 :
Июль 04, 2012, 12:40 »
Консольный - вообще никакой разницы.
Dll необлходима для глобального хука. Без dll глобальный хук не сделашь. Только в своей программе.
Выкладывайте свой проект, будем смотреть.
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #21 :
Июль 04, 2012, 12:50 »
ой, спасибо
Вот библиотека и проект. Буду ждать)
«
Последнее редактирование: Июль 04, 2012, 12:53 от virtual_root
»
Записан
Bepec
Гость
Re: События перемещения мыши
«
Ответ #22 :
Июль 04, 2012, 13:18 »
А вы уверены, что второй проект у вас компилится?
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #23 :
Июль 04, 2012, 13:33 »
да, компилировался. Но когда запускался падал с assert(hHook);
Сейчас сделала локальный хук, в том же проекте изменила файл main.cpp. Вот что получилось:
Код:
#include <QtCore/QCoreApplication>
#include <windows.h>
#include <assert.h>
#include <cassert>
#include <QLibrary>
#include <fstream>
#include <QDebug>
LRESULT CALLBACK HookProcMouse(int nCode, WPARAM wParam, LPARAM lParam)
{
// если сообщение не удалено из очереди(не особо заморачивайтесь по этому поводу)
if (nCode != HC_ACTION )
return CallNextHookEx(NULL, nCode, wParam, lParam);
// Если событие передвижения мыши
if (wParam == WM_MOUSEMOVE)
{
// то получаем указатель на структуру
MOUSEHOOKSTRUCT *tmp = (MOUSEHOOKSTRUCT*)lParam;
// открываем файл для записи, записываем и закрываем(координаты x и y)
char xs = wParam;
std::ofstream out("c:/123", std::ios::app);
out << xs << tmp->pt.x << tmp->pt.y << std::endl;
out.close();
int x = tmp->pt.x; // извлекаем младший байт, это и есть координата х мыши
int y = tmp->pt.y; // извлекаем старший байт, это и есть координата у мыши
qDebug()<<x << y;
}
else
{
// иначе если сообщение другого типа, создаём 321, пишем, закрываем
std::ofstream out("c:/321", std::ios::app);
char xs = wParam;
out << xs << std::endl;
out.close();
}
// передаём следующему хуку по цепочке(не вашим хукам, а уже чужим)
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
/* QLibrary myLib("./libMouseAPI");
myLib.load();
myLib.loadHints();
if (!myLib.isLoaded())
exit(0);
typedef LRESULT CALLBACK (*MyPrototype)(int, WPARAM, LPARAM);
MyPrototype myFunction = (MyPrototype) myLib.resolve("HookProcMouse");
if (!myFunction)
exit(0);*/
static HHOOK hHook;
hHook = SetWindowsHookEx(WH_MOUSE_LL, HookProcMouse, GetModuleHandle(NULL), NULL);
assert(hHook);
return a.exec();
}
Всё работает, координаты приходят! Хоть какой-то успех за два дня! Но вот с глобальным всё так же плохо...
Пожалуйста, Верес, помогите)
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #24 :
Июль 04, 2012, 15:42 »
Я нашла решение. Можно использовать локальные и с помощью сигналов пересылать данные. Спасибо вам большое)
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #25 :
Июль 04, 2012, 16:33 »
Верес, вы не подскажите а как антивирусник Касперского обойти? Он ругается на хуки?
Хакеры это как-то же делают
Записан
virtual_root
Гость
Re: События перемещения мыши
«
Ответ #26 :
Июль 04, 2012, 16:46 »
Ещё вопросик. Я так же написала класс который отлавливает все нажатия на клавиатуре, правда с хуками. А можно это как-то средствами qt сделать? Мне собственно нужно подсчитывать сколько было нажато клавиш в каждую минуту времени. Подскажите пожалуйста кроссплатформенное решение кто-нибудь.
Записан
Bepec
Гость
Re: События перемещения мыши
«
Ответ #27 :
Июль 04, 2012, 16:48 »
Мне уже начинает надоедать
Вы хотите перехватывать нажатия клавиш без перехвата?
Перечитайте третий помоему ответ на ваш вопрос в этой теме.
PS вы видимо неправильно ставите хуки, или же творите что-то страшное. Ибо каспер на правильно поставленный глобальный хук не ругается.
Записан
lighting
Гость
Re: События перемещения мыши
«
Ответ #28 :
Июль 05, 2012, 09:02 »
Bepec
ты решил тут мастер-класс по троянописанию устроить?
Записан
Bepec
Гость
Re: События перемещения мыши
«
Ответ #29 :
Июль 05, 2012, 10:16 »
lighting - если Windows описала механизм создания хуков, описала их Api, использует их везде где только можно и РЕКОМЕНДУЕТ их использовать, это можно назвать троянописанием?
PS вот методы сокрытия хука я раскрывать не собираюсь
А так это - необходимые основы для многих программ.
Записан
Страниц:
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...