1

次のプログラムは、1 秒ごとに "a" と "b" を押すことをシミュレートすると予想されていましたが、何もしませんでした。うまくいかないのはなぜですか?

#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)

メモリ位置へのアクセスが無効です。

しかし、何が原因なのかわかりません。

4

1 に答える 1

2

試す

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

戻り値がゼロでないことを確認します。実際、これは送信された入力の数 (この場合は 4) に等しいはずです。

別のスレッドまたは UIPI ( User Interface Privilege Isolation )によってブロックされている場合、関数は失敗する可能性があります。

他の問題を回避するために、現在のキーボードの状態を確認しSendInputたり、入力ストリームに追加したり、実行中に他のキーが押されたりすると干渉する可能性があります。

好奇心から、どのアクションをシミュレートしようとしていますか? 一般に、アプリケーションへのユーザー入力を「偽造」することは、あまり適切な方法ではありません。

于 2012-08-10T20:00:11.170 に答える