2012-08-10 3 views
1

다음 프로그램은 매초마다 "a"와 "b"를 눌러 시뮬레이션 할 예정 이었지만 아무 것도하지 않았습니다. 왜 효과가 없습니까?SendInput 함수를 사용하여 입력 시뮬레이션

#include <Windows.h> 
#include <iostream> 

using namespace std; 

const int INPUTS = 4; 

int main() 
{ 
    INPUT inputArray[INPUTS]; 

    INPUT input; 

    input.type = INPUT_KEYBOARD; 

    //Press 'a' key 
    input.ki.wVk = 0x41; 
    input.ki.wScan = MapVirtualKey(0x41,MAPVK_VK_TO_VSC); 
    inputArray[0] = input; 

    //Release 'a' key 
    input.ki.dwFlags = KEYEVENTF_KEYUP; 
    inputArray[1] = input; 


    //Press 'b' key 
    input.ki.dwFlags = 0; 
    input.ki.wVk = 0x42; 
    input.ki.wScan = MapVirtualKey(0x42,MAPVK_VK_TO_VSC); 
    inputArray[2] = input; 

    //Release 'b' key 
    input.ki.dwFlags = KEYEVENTF_KEYUP; 
    inputArray[3] = input; 

    Sleep(5000); 

    std::cout<<"GO!!!\n"; 

    for(int i=0; i<100; i++) 
    { 
     SendInput(sizeof(inputArray),inputArray,sizeof(INPUT)); 
     Sleep(1000); //Don't remove! 
    }  

    std::cout<<GetLastError()<<std::endl; 

    system("Pause"); 
    return 0; 
} 

마지막 에러가 메모리 위치

ERROR_NOACCESS

998 (0x3E6)

잘못된 접근이다.

하지만 그 원인을 알 수 없습니다.

+1

Sendinput의 첫 번째 매개 변수가 잘못되었습니다. –

+1

또한 첫 번째 INPUT의 input.ki.dwFlags는 INPUT 입력이 선언되었지만 아무 것도 초기화되지 않았기 때문에 스택의 임의 가비지 일 수 있습니다. 세 번째 항목에서와 같이 명시 적으로 0으로 설정해야합니다. – BrendanMcK

답변

2

SendInput(INPUTS, inputArray, sizeof(INPUT)); 

을 시도하고 반환 값이 0인지 확인합니다. 사실,이 다른 스레드 또는 UIPI 차단되면 기능 장애가있다 4.

이 경우, 전송 된 입력들의 수와 동일해야한다 (User Interface Privilege Isolation)

원할 수있는 다른 문제가 발생하지 않도록 현재 키보드의 상태뿐만 아니라 SendInput이 입력 스트림에 추가되고이 키가 실행되는 동안 다른 키가 눌러져 있으면이를 방해 할 수 있습니다.

호기심 벗어남 당신은 어떤 행동을 시뮬레이션하려고합니까? 일반적으로 모든 응용 프로그램에 대한 사용자 입력을 "위장"하는 것은 매우 유익하지 않습니다.

관련 문제