1 (изменено: Remo, 2022-08-21 00:47:55)

Тема: AHK: Эмуляция движения мыши на уровне драйвера

Здравствуйте, хотел бы спросить совета. Я пытаюсь сделать один скрипт, в котором нажатия клавиш мыши и передвижения курсора будут эмулироваться на уровне драйвера. Нужно это для того, что бы некоторые программы которые блокируют эмуляцию мыши и клавиатуры программным образом, то есть которые происходят с помощью API библиотек винды функциями по типу "SendInput" или "mouse_event". Я вычитал, что блокируются события мыши, потому что вместе с этими функциями винда выставляет еще и флаг, обозначающий то, что они были эмулированы, грубо говоря. Так вот сам вопрос, кто-то сталкивался с подобной проблемой и может ли поделиться какой-нибудь библиотекой, которая посылает команду сразу на usb порт, создавая при этом виртуальную мышь, ну или что-то в это духе. Насколько я понял, пытаться найти способ запретить винде выставлять этот флаг при выполнении функции, как минимум очень геморная задача, поэтому решил пойти таким путем.

Вот кусок кода с моей программы, тут я с помощью "SendInput" пытался, в итоге, в окне удаленного доступа ничего происходит.

#NoEnv
#SingleInstance, Force
#Persistent
#InstallKeybdHook
#UseHook
#KeyHistory, 0
;#HotKeyInterval 1
;#MaxHotkeysPerInterval 127

SetKeyDelay,-1, 1
SetControlDelay, -1
SetMouseDelay, -1
SetWinDelay,-1
SetBatchLines,-1
ListLines, Off
PID := DllCall("GetCurrentProcessId")
Process, Priority, %PID%, High

mouse_sendinput_xy(x2, y2, Absolute := False)
{
    global Mon_Width, Mon_Hight, gmok
    static SysX, SysY
    SysX := 65535 // Mon_Width, SysY := 65535 // Mon_Hight
    static INPUT_MOUSE := 0, MOUSEEVENTF_MOVE := 0x0001, MOUSEEVENTF_ABSOLUTEMOVE := 0x8001
    StructSize := A_PtrSize + 4*4 + A_PtrSize*2
    VarSetCapacity(MouseInput_Move, StructSize)
    NumPut(INPUT_MOUSE, MouseInput_Move, "UInt")

    If Absolute
        x2 *= SysX, y2 *= SysY
    Else
    {
        DPI_Ratio := Round(A_ScreenDPI / 96, 3)
        x2 := (x2 != 0) ? (x2 / Abs(x2) * Ceil(Abs(x2) / DPI_Ratio)) : 0
        y2 := (y2 != 0) ? (y2 / Abs(y2) * Ceil(Abs(y2) / DPI_Ratio)) : 0

        Random, RandXY, -1, 1
        If (x2 = 0) && (y2 > 2)
            x2 := RandXY
        Else If (y2 = 0) && (x2 > 2)
            y2 := RandXY
    }

    NumPut(x2, MouseInput_Move, A_PtrSize, "UInt")
    NumPut(y2, MouseInput_Move, A_PtrSize + 4, "UInt")
    If Absolute
        NumPut(MOUSEEVENTF_ABSOLUTEMOVE, MouseInput_Move, A_PtrSize + 4*3, "UInt")
    Else
        NumPut(MOUSEEVENTF_MOVE, MouseInput_Move, A_PtrSize + 4*3, "UInt")

    If gmok
        DllCall("ghub_mouse.dll\Mach_Move", "Char", x2, "Char", y2, "Int", 0)
    Else
        DllCall("SendInput", "UInt", 1, "Ptr", &MouseInput_Move, "Int", StructSize)
    VarSetCapacity(MouseInput_Move, 0) ;
}

mouse_sendinput_xy(10, 10, False)

Нарыл еще на гитхабе пару тем о эмуляции на уровне драйвера:

Вот эта мне показалась очень подходящей, но я не понял как можно из нее команды подсунуть в ahk. Как из обычной dll я так понимаю не получиться, раньше мало был знаком с гитхабом, поэтому с большим трудом разбираюсь, как пользоваться кодом от туда. Если кто-то понял, подскажите пожалуйста, как можно с помощью этого виртуального драйвера в ахк засунуть команду мышке. https://github.com/hedgar2017/loki-hidriver

Еще один драйвер с гитхаба, как я понял более менее популярный interception, я пошарился в нем по библиотекам и вообще ничего не нашел для моей задачи. Либо я такой затупок, либо драйвер этот был для других целей написан. https://github.com/oblitum/Interception

Я так же посмотрел пару примеров по работе с interception в ahk, но об эмуляции нажатия клавиш там речи не шло. Так что уважаемые знатоки, подскажите, пожалуйста, можно ли как-то реализовать такую штуку.