【发布时间】:2017-09-25 17:19:35
【问题描述】:
我已将我的项目代码压缩到下面的示例中以显示我的问题。
example/sn-p 引用了使用here 和here 的概念。 控制台输出显示已发送 4 个事件;所以我希望记事本中的输出为“12”,但我在记事本中只看到“1”。有人可以指出我正确的方向吗?该 jar 是在 Windows 10 x64 上构建和运行的。
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WTypes.BSTR;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.BaseTSD;
import com.sun.jna.platform.win32.User32;
public class App {
public static void main( String[] args )
{
int KEYEVENT_SCANCODE = 0x0008;
int KEYEVENT_UP = 0x0002;
WinUser.INPUT[] inputArray = (WinUser.INPUT[]) new WinUser.INPUT().toArray(4);
inputArray[0].type = new WinDef.DWORD(WinUser.INPUT.INPUT_KEYBOARD);
inputArray[0].input.setType("ki");
inputArray[0].input.ki.time = new WinDef.DWORD(0);
inputArray[0].input.ki.wVk = new WinDef.WORD(0); //using scancodes instead
inputArray[0].input.ki.dwExtraInfo = new BaseTSD.ULONG_PTR(0);
inputArray[0].input.ki.dwFlags = new WinDef.DWORD(KEYEVENT_SCANCODE);
inputArray[0].input.ki.wScan = new WinDef.WORD(0x01);
inputArray[1].type = new WinDef.DWORD(WinUser.INPUT.INPUT_KEYBOARD);
inputArray[1].input.setType("ki");
inputArray[1].input.ki.time = new WinDef.DWORD(0);
inputArray[1].input.ki.wVk = new WinDef.WORD(0); //using scancodes instead
inputArray[1].input.ki.dwExtraInfo = new BaseTSD.ULONG_PTR(0);
inputArray[1].input.ki.dwFlags = new WinDef.DWORD(KEYEVENT_SCANCODE | KEYEVENT_UP);
inputArray[1].input.ki.wScan = new WinDef.WORD(0x01);
inputArray[2].type = new WinDef.DWORD(WinUser.INPUT.INPUT_KEYBOARD);
inputArray[2].input.setType("ki");
inputArray[2].input.ki.time = new WinDef.DWORD(0);
inputArray[2].input.ki.wVk = new WinDef.WORD(0); //using scancodes instead
inputArray[2].input.ki.dwExtraInfo = new BaseTSD.ULONG_PTR(0);
inputArray[2].input.ki.dwFlags = new WinDef.DWORD(KEYEVENT_SCANCODE);
inputArray[2].input.ki.wScan = new WinDef.WORD(0x02);
inputArray[3].type = new WinDef.DWORD(WinUser.INPUT.INPUT_KEYBOARD);
inputArray[3].input.setType("ki");
inputArray[3].input.ki.time = new WinDef.DWORD(0);
inputArray[3].input.ki.wVk = new WinDef.WORD(0); //using scancodes instead
inputArray[3].input.ki.dwExtraInfo = new BaseTSD.ULONG_PTR(0);
inputArray[3].input.ki.dwFlags = new WinDef.DWORD(KEYEVENT_SCANCODE | KEYEVENT_UP);
inputArray[3].input.ki.wScan = new WinDef.WORD(0x02);
System.out.println("Make sure notepad is in focus...");
try { Thread.sleep(7000); } catch (Throwable ex) { System.out.println("Interrupted"); }
WinDef.DWORD sentInputs = User32.INSTANCE.SendInput(
new WinDef.DWORD(inputArray.length),
inputArray,
inputArray[0].size()
);
System.out.println("Sent Input Count: " + sentInputs.intValue());
}
}
控制台输出:
E:\SKGDE\my-app\target>java -jar my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
确保记事本处于焦点...
发送输入计数:4
E:\SKGDE\my-app\target>
【问题讨论】: