Доброго времени суток. Имеется код, написанный не без помощи форумчан: Код (Text): void GenerateKeyService ( WORD vk) { INPUT inpt[1]; DWORD64 tmpXMM0; int ret; __asm movq [tmpXMM0], xmm0; inpt[0].type=INPUT_KEYBOARD; inpt[0].ki.wVk=vk; inpt[0].ki.time=NULL; inpt[0].ki.dwExtraInfo=GetMessageExtraInfo(); inpt[0].ki.wScan= MapVirtualKey(vk, 0); inpt[0].ki.dwFlags=NULL; inpt[1].type=INPUT_KEYBOARD; inpt[1].ki.wVk=vk; inpt[1].ki.time=NULL; inpt[1].ki.dwExtraInfo=GetMessageExtraInfo(); inpt[1].ki.wScan= MapVirtualKey(vk, 0); inpt[1].ki.dwFlags=KEYEVENTF_KEYUP; ret=SendInputServiceCall_sysenter(2,&inpt[0],sizeof(inpt)); DebugPrintF("ret=SendInputServiceCall_sysenter=%x",ret); __asm movq xmm0, [tmpXMM0]; return; } Код (Text): int SendInputServiceCall_sysenter (UINT Count, LPINPUT Input, int SizeInput) { __asm { mov eax, NtUserSendInput push SizeInput push Input push Count push eax ; просто заполнитель до -8 push aa mov edx, esp sysenter aa: add esp, 16 ; очистка стека от временных переменных } } Самое странное что вообще работает, так как размерность массива должна быть 2 Код (Text): INPUT inpt[2]; Но отрабатывает только один раз с каждой кнопкой, второй раз послать VK_RETURN, например, не получится. Может кто нибудь подсказать в чем может быть проблема? как это понимать? Как напрямую работать с очередью ввода потока? Есть ли возможность привести ее в изначальное состояние из R3? P.S. Простите, знаю что достал уже, но вопреки всем мануалам и ковыряниям, всего, чего удалось добиться,-это однократного нажатия каждой из кнопок виртуальной клавы(
punxer Дык чёткая постановка задачи - половина её решения ) Ты начал с того, что тебе нужно реверснуть SendInput, которая "работает но не стабильно в условиях чужого навороченного приложения", потом захотел написать к ней свой заменитель (хотя нет никакой разницы кем вызывается сервис, если он вызывается корректно)... И только теперь выясняется, что на самом деле тебе нужно не это, а разобраться в том как эту SendInput правильно применять ) Начни с того, чтобы понажимать кнопки в своей простейшей проге, просто выводящей на экран все действия с кнопками, сразу увидишь что доходит, а что теряется, потом понажимай _своё_ меню с горячими клавишами, потом переходи к стандартному win калькулятору, а уж там и в чужое грандиозное приложение наработанный код переноси Имхо 99% что SendInput у тебя работает "не так" из-за какой-то очень мелкой и нелепой ошибки, которую ты быстро обнаружишь отладчиком в своей тестовой программе и все "суперзаменители", в том числе сбрасывающие очередь нажатий из R3 окажутся ненужны
Y_Mur спасибо конечно, но раньше таких проблем не возникало и все что ты написал я успешно делал( сейчас вроде работает только так, ппц Код (Text): void GenerateKeyService ( WORD vk) { INPUT inpt[1]; DWORD64 tmpXMM0; int ret; __asm movq [tmpXMM0], xmm0; inpt[0].type=INPUT_KEYBOARD; inpt[0].ki.wVk=vk; inpt[0].ki.time=NULL; inpt[0].ki.dwExtraInfo=GetMessageExtraInfo(); inpt[0].ki.wScan= MapVirtualKey(vk, 0); inpt[0].ki.dwFlags=NULL; inpt[1].type=INPUT_KEYBOARD; inpt[1].ki.wVk=vk; inpt[1].ki.time=NULL; inpt[1].ki.dwExtraInfo=GetMessageExtraInfo(); inpt[1].ki.wScan= MapVirtualKey(vk, 0); inpt[1].ki.dwFlags=KEYEVENTF_KEYUP; ret=SendInputServiceCall_sysenter(2,&inpt[0],sizeof(inpt)); DebugPrintF("ret=SendInputServiceCall_int2e=%x",ret); //kill me keybd_event((BYTE)vk,NULL,NULL,NULL); keybd_event((BYTE)vk,NULL,KEYEVENTF_KEYUP,NULL); __asm movq xmm0, [tmpXMM0]; return; }