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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: События перемещения мыши  (Прочитано 20318 раз)
Bepec
Гость
« Ответ #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
Гость
« Ответ #16 : Июль 03, 2012, 15:16 »

спасибо большое, сейчас буду пробовать к себе в qt это всё применить.
Записан
virtual_root
Гость
« Ответ #17 : Июль 04, 2012, 10:25 »

Верес, подскажите мне ещё разок пожалуйста. Я сделала снова библиотеку как у вас. Но я не знаю как мне в Qt .def файл привязать к библиотеки, как это сделать? У меня проект вылетает с ошибкой на assert(hProc). Я так понимаю это он не может найти функцию?
и ещё мне пришлось так заменить строку с подключением библиотеки:
Код:
 hLib = LoadLibrary(L"libMouseAPI");
Ну думаю это ничего не меняет? Сам dll файл лежит рядом с .exe файлом программы где я подключаю его.
« Последнее редактирование: Июль 04, 2012, 10:28 от virtual_root » Записан
Bepec
Гость
« Ответ #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
Гость
« Ответ #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
Гость
« Ответ #20 : Июль 04, 2012, 12:40 »

Консольный - вообще никакой разницы.
Dll необлходима для глобального хука. Без dll глобальный хук не сделашь. Только в своей программе.

Выкладывайте свой проект, будем смотреть.
Записан
virtual_root
Гость
« Ответ #21 : Июль 04, 2012, 12:50 »

ой, спасибо Улыбающийся
Вот библиотека и проект. Буду ждать)
« Последнее редактирование: Июль 04, 2012, 12:53 от virtual_root » Записан
Bepec
Гость
« Ответ #22 : Июль 04, 2012, 13:18 »

А вы уверены, что второй проект у вас компилится?
Записан
virtual_root
Гость
« Ответ #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
Гость
« Ответ #24 : Июль 04, 2012, 15:42 »

Я нашла решение. Можно использовать локальные и с помощью сигналов пересылать данные. Спасибо вам большое)
Записан
virtual_root
Гость
« Ответ #25 : Июль 04, 2012, 16:33 »

Верес, вы не подскажите а как антивирусник Касперского обойти? Он ругается на хуки?
Хакеры это как-то же делают Подмигивающий
Записан
virtual_root
Гость
« Ответ #26 : Июль 04, 2012, 16:46 »

Ещё вопросик. Я так же написала класс который отлавливает все нажатия на клавиатуре, правда с хуками. А можно это как-то средствами qt сделать? Мне собственно нужно подсчитывать сколько было нажато клавиш в каждую минуту времени. Подскажите пожалуйста кроссплатформенное решение кто-нибудь.
Записан
Bepec
Гость
« Ответ #27 : Июль 04, 2012, 16:48 »

Мне уже начинает надоедать Веселый

Вы хотите перехватывать нажатия клавиш без перехвата? Улыбающийся

Перечитайте третий помоему ответ на ваш вопрос в этой теме.

PS вы видимо неправильно ставите хуки, или же творите что-то страшное. Ибо каспер на правильно поставленный глобальный хук не ругается.
Записан
lighting
Гость
« Ответ #28 : Июль 05, 2012, 09:02 »

Bepec ты решил тут мастер-класс по троянописанию устроить? Улыбающийся
Записан
Bepec
Гость
« Ответ #29 : Июль 05, 2012, 10:16 »

lighting - если Windows описала механизм создания хуков, описала их Api, использует их везде где только можно и РЕКОМЕНДУЕТ их использовать, это можно назвать троянописанием? Веселый

PS вот методы сокрытия хука я раскрывать не собираюсь Веселый А так это - необходимые основы для многих программ.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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