Global Mouse Hook + имитация ввода мыши

Я хочу создать глобальный хук для мыши, который работает в 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++? Любая помощь будет принята с благодарностью. Спасибо!


person Drax    schedule 05.01.2010    source источник
comment
Это звучит изворотливо. Зачем вам это нужно?   -  person Skilldrick    schedule 05.01.2010
comment
Я хочу создать интерфейс для мыши, который перекрывает Windows системой 3D-меню, и мне нужно иметь возможность вращать, масштабировать, панорамировать и т. д., сохраняя ввод с помощью мыши, поэтому мне нужно иметь возможность перехватывать ввод с помощью мыши низкий уровень и изменить/модулировать его.   -  person Drax    schedule 20.01.2010


Ответы (2)


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

person Darth Continent    schedule 05.01.2010

Я создал библиотеку, которая может помочь вам в этом, это простая библиотека 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.

person pepper_chico    schedule 16.02.2012
comment
Спасибо. Обязательно загляну в вашу библиотеку. - person jay.lee; 24.02.2012