什么会导致SendInput在每个键实例后停止工作?

时间:2017-07-14 09:41:22

标签: c#

我正在尝试使用SendInput来自动执行一些按键操作。在简单的测试中(即打开记事本并观察笔画发生),笔画工作正常。模拟空间一遍又一遍地工作,字母等

但是,尝试将此输入发送到某个应用程序时,SendInput仅适用于某个键的第一个实例。所以,我可以发送一次Space,下次当我尝试发送Space时,它实际上不会被发送。 (即使它会在任何其他应用程序中发送)然后我可以发送一次A,但下次我尝试发送A它不会发送。等等。

这是我正在遇到的某种许可问题吗?初始输入工作得很好,但是在按下相同键后不会。

为了提供更多内容,这里有一个示例方法,假设所有标准结构:

    public static void PressEnter()
    {
        INPUT[] Inputs = new INPUT[1];
        INPUT Input = new INPUT();

        Input.type = 1; // 1 = Keyboard Input
        Input.U.ki.wScan = ScanCodeShort.RETURN;
        Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
        Inputs[0] = Input;

        uint returnInput = SendInput(1, Inputs, INPUT.Size);

        Console.WriteLine(returnInput);
    }

我可以用Notepad重复一遍又一遍地重复这个,并且将继续返回。但是,当将此反复发送到此特定应用程序时,只有第一个应用程序通过。但是,我可以按下键盘上的Enter键,接受就好了。应用程序是否可以拒绝来自SendInput的输入?

1 个答案:

答案 0 :(得分:0)

这是模拟KeyUp标志的一种方法

INPUT input[4];

input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = 0;
input[0].ki.wScan = ScanCodeShort.RETURN;
input[0].ki.dwFlags = 0;

input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = 0;
input[1].ki.wScan = ScanCodeShort.RETURN;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;

input[2].type = INPUT_KEYBOARD;
input[2].ki.wVk = 0;
input[2].ki.wScan = ScanCodeShort.RETURN;
input[2].ki.dwFlags = 0;

input[3].type = INPUT_KEYBOARD;
input[3].ki.wVk = 0;
input[3].ki.wScan = ScanCodeShort.RETURN;
input[3].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(4, input, sizeof(INPUT));
  

INPUT_KEYBOARD是输入

     

KEYEVENTF_KEYUP将模拟KeyUp

通过这种方式,您可以发送多次击键。试试吧,希望这对你有用。