I've condensed my project code into the example below to show my issue.
The example/snippet references concepts used here and here. The console output shows 4 events sent; so I expected the output in notepad to be "12", but I only see "1" in Notepad. Can someone point me in the right direction? The jar was built and run on 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());
}
}
Console Output:
E:\SKGDE\my-app\target>java -jar my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
Make sure notepad is in focus...
Sent Input Count: 4
E:\SKGDE\my-app\target>