窗口忽略SendInput键

时间:2016-06-02 20:56:48

标签: c# powershell sendinput

我正在尝试自动在软件中插入一些数据。该软件有一个弹出窗口,需要一个带有文本字段和2个按钮的密码。

我的意图是编写该密码并使用powershell脚本在该字段上按ENTER键。

我尝试了很多方法,比如Windows.Form.SendKeys,但是没有一个方法在该字段中写入。我甚至尝试过InputSimulator类,但即使这样也无法写入该字段。 我尝试过的唯一可以写入该字段的是屏幕键盘。 经过一些搜索,我发现它应该使用SendInput命令来模拟密钥。使用Api监控我已经检查了调用,并且我重新创建了一个类似的SendInput调用来写一个小写的'a',使用类似于这个答案中的代码: https://stackoverflow.com/a/18854441/4417646

我尝试过使用和不使用wVk值,但我的脚本仍然无法在该字段中写入。 我已经监控了关于从屏幕键盘上完成的键盘的所有其他调用,但我还没有看到任何调用。 在发送SendInput命令之前,我使用代码来聚焦窗口和1秒的睡眠以确保窗体处于焦点上。 如果我在任何其他窗口使用相同的调用,它可以工作......(我已经尝试过记事本和其他随机软件)

我错过了什么吗?

以下是调用SendInput的代码部分:(它是导出到powershell的c#类)

public static void SendKeyboard(char ch) {
    lpInput[] KeyInputs = new lpInput[1];
    lpInput KeyInput = new lpInput();
    // Generic Keyboard Event
    KeyInput.type = InputType.INPUT_KEYBOARD;
    KeyInput.Data.ki.time = 0;
    KeyInput.Data.ki.dwExtraInfo = UIntPtr.Zero;

    short key = VkKeyScan(ch);
    uint mappedKey = MapVirtualKey( LoByte( key ), 0 );

    // Push the correct key
    KeyInput.Data.ki.wVk = 0;
    KeyInput.Data.ki.wScan = (Int16)mappedKey;
    KeyInput.Data.ki.dwFlags = KEYEVENTF.SCANCODE;
    KeyInputs[0] = KeyInput;
    SendInput(1, KeyInputs, lpInput.Size);

    // Release the key
    KeyInput.Data.ki.dwFlags = KEYEVENTF.SCANCODE | KEYEVENTF.KEYUP;
    KeyInputs[0] = KeyInput;
    SendInput(1, KeyInputs, lpInput.Size);

    return;
}

感谢大家! 我希望有人可以帮助我;)

0 个答案:

没有答案