我正在尝试自动在软件中插入一些数据。该软件有一个弹出窗口,需要一个带有文本字段和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;
}
感谢大家! 我希望有人可以帮助我;)