Global Mouse Hook + Имитация мыши - PullRequest
       41

Global Mouse Hook + Имитация мыши

2 голосов
/ 05 января 2010

Я хочу создать глобальную мышиную ловушку, которая работает в XP / Vista / 7, которая позволила бы мне получить доступ к значениям X, Y, которые вводит мышь, и изменить эти значения, прежде чем они коснутся Windows ...

Я также хочу иметь возможность имитировать вводы мыши между фактическими вводами мыши ...

Например, предположим, что наши входные данные выглядели так:

1: 1,0 2: 2,0 3: 3,0 4:?,?

Я хочу иметь возможность перехватывать ввод № 4 и запускать его с помощью оператора «если»: если значение ввода соответствует определенным параметрам, я хочу изменить значение, добавляя или вычитая из него ...

Мышь USB по умолчанию имеет частоту опроса 125 Гц и максимальную частоту 1000 Гц ...

Если возможно (особенно когда частота опроса установлена ​​ниже 1000 Гц), я бы хотел «вставить» входы между «фактическими обновлениями мыши (критическими), например, так:

(в миллисекундах)

0008 - 1,0 0016 - 1,0 0032 - 2,0

Итак, мышь обновляется с частотой 125 Гц ... Могу ли я определить частоту входов и отправлять входные данные через каждый второй вход ??? Так, например, я мог бы «удвоить» частоту мыши с 125 Гц до 250 Гц и моделировать свои собственные «промежуточные» обновления, основываясь на любых установленных мной правилах ...

Что-нибудь из этого кажется разумным? Прямо сейчас я работаю в C #, и я работал с «Gma.UserActivityMonitor» из этого учебного руководства здесь: http://www.codeproject.com/KB/cs/globalhook.aspx, но по какой-то причине я получаю снижение производительности, которое делает использование этого кода в полноэкранных играх неоправданно задерживающимся на входах мыши из-за зацепки ...

Возможно, мне нужно что-то написать на C ++? Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Я создал библиотеку, которая может вам в этом помочь, это простая библиотека c, и может работать в играх, где обычные windows api не .

В следующем примере показано, как инвертировать движения мыши с помощью этой библиотеки, в основном она просто умножает смещения по вертикальной оси на -1, чтобы они происходили в противоположном направлении:

#include <interception.h>
#include "utils.h" // for process priority control

enum ScanCode
{
    SCANCODE_ESC = 0x01
};

int main()
{
    InterceptionContext context;
    InterceptionDevice device;
    InterceptionStroke stroke;

    raise_process_priority();

    context = interception_create_context();

    interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP);
    interception_set_filter(context, interception_is_mouse, INTERCEPTION_FILTER_MOUSE_MOVE);

    while(interception_receive(context, device = interception_wait(context), &stroke, 1) > 0)
    {
        if(interception_is_mouse(device))
        {
            InterceptionMouseStroke &mstroke = *(InterceptionMouseStroke *) &stroke;

            if(!(mstroke.flags & INTERCEPTION_MOUSE_MOVE_ABSOLUTE)) mstroke.y *= -1;

            interception_send(context, device, &stroke, 1);
        }

        if(interception_is_keyboard(device))
        {
            InterceptionKeyStroke &kstroke = *(InterceptionKeyStroke *) &stroke;

            interception_send(context, device, &stroke, 1);

            if(kstroke.code == SCANCODE_ESC) break;
        }
    }

    interception_destroy_context(context);

    return 0;
}    

Вы можете видеть, что есть проверка флага INTERCEPTION_MOUSE_MOVE_ABSOLUTE перед инвертированием вертикальных смещений. Обычно операционная система работает с относительными координатами, но я обнаружил, что внутри виртуальных машин координаты мыши работают в абсолютной форме, а не в относительной. Для простоты этот пример инвертирует только относительные смещения.

Дополнительную документацию можно посмотреть по адресу http://oblita.com/Interception.

1 голос
/ 05 января 2010

Надеюсь, эта ссылка на ввод необработанных данных мыши будет полезна, она включает библиотеку, написанную для C #, а также версию для C ++. Он предназначен для использования нескольких мышей в Windows, но, надеюсь, вы сможете эмулировать то, что он использует, для того, чего вы хотите достичь.

...