KerberX
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: User32 = Library.Load("User32.dll"); POINTER = UINT; -- Change to QWORD if AMS will ever become 64-bit program. MOUSEINPUT = MemoryEx.DefineStruct( { DWORD("dx"); DWORD("dy"); DWORD("mouseData"); DWORD("dwFlags"); DWORD("time"); POINTER("dwExtraInfo"); }); KEYBDINPUT = MemoryEx.DefineStruct( { WORD("wVk"); WORD("wScan"); DWORD("dwFlags"); DWORD("time"); POINTER("dwExtraInfo"); }); HARDWAREINPUT = MemoryEx.DefineStruct( { DWORD("uMsg"); WORD("wParamL"); WORD("wParamH"); }); SENDINPUT = MemoryEx.DefineStruct( { DWORD("type"); BYTE("Union", MemoryEx.StructSize(MOUSEINPUT)); }); INPUT_MOUSE = 0; INPUT_KEYBOARD = 1; INPUT_HARDWARE = 2; -- Mouse MOUSEEVENTF_ABSOLUTE = 0x8000; MOUSEEVENTF_HWHEEL = 0x01000; MOUSEEVENTF_MOVE = 0x0001; MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000; MOUSEEVENTF_LEFTDOWN = 0x0002; MOUSEEVENTF_LEFTUP = 0x0004; MOUSEEVENTF_RIGHTDOWN = 0x0008; MOUSEEVENTF_RIGHTUP = 0x0010; MOUSEEVENTF_MIDDLEDOWN = 0x0020; MOUSEEVENTF_MIDDLEUP = 0x0040; MOUSEEVENTF_VIRTUALDESK = 0x4000; MOUSEEVENTF_WHEEL = 0x0800; MOUSEEVENTF_XDOWN = 0x0080; MOUSEEVENTF_XUP = 0x0100; WHEEL_DELTA = 120; XBUTTON1 = 0x0001; XBUTTON2 = 0x0002; -- Keyboard KEYEVENTF_EXTENDEDKEY = 0x0001; KEYEVENTF_KEYUP = 0x0002; KEYEVENTF_SCANCODE = 0x0008; KEYEVENTF_UNICODE = 0x0004; -- SendInput: https://msdn.microsoft.com/en-us/library/ms646310(v=vs.85).aspx function System.SendInput(nType, ...) -- arg = {...}; -- For Lua 5.2+ local tStruct; if (nType == INPUT_MOUSE) then local tCoords = arg[1]; local nFlags = arg[2]; local nData = arg[3] or 0; tStruct = MOUSEINPUT:New(); tStruct.dx = tCoords.X; tStruct.dy = tCoords.Y; tStruct.dwFlags = nFlags; tStruct.mouseData = nData; tStruct.time = 0; tStruct.dwExtraInfo = User32.GetMessageExtraInfo(); elseif (nType == INPUT_KEYBOARD) then local nKeyCode = arg[1]; -- https://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx local nFlags = arg[2]; tStruct = KEYBDINPUT:New(); tStruct.wVk = nKeyCode; tStruct.wVk = 0; if (Bitwise.And(nFlags, KEYEVENTF_SCANCODE)) then tStruct.wScan = nKeyCode; elseif (Bitwise.And(nFlags, KEYEVENTF_UNICODE)) then tStruct.wVk = 0; tStruct.wScan = nKeyCode; end tStruct.dwFlags = nFlags; tStruct.time = 0; tStruct.dwExtraInfo = User32.GetMessageExtraInfo(); elseif (nType == INPUT_KEYBOARD) then local nMsg = arg[1]; tStruct = HARDWAREINPUT:New(); tStruct.uMsg = nMsg; tStruct.wParamL = Bitwise.And(nMsg, 0xffff); tStruct.wParamH = Bitwise.And(Bitwise.ASR(nMsg, 16), 0xffff); else error("unknown input type: "..tostring(nType)); end local tInput = SENDINPUT:New(); tInput.type = nType; MemoryEx.Copy(tStruct:GetPointer(), tInput:GetPointer()+tInput:Offset("Union"), tStruct:Size()); tStruct:Free(); local nRet = User32.SendInput(1, tInput:GetPointer(), tInput:Size()); tInput:Free(); return nRet; end | Вызывается она так: Код: System.SendInput(INPUT_KEYBOARD, 38, 0); | | Всего записей: 597 | Зарегистр. 08-09-2011 | Отправлено: 18:30 23-06-2017 | Исправлено: KerberX, 18:35 23-06-2017 |
|