Разница между ключом numpad-9 и G-Key при использовании SendMessage
Я использую JNA для отправки входных данных в нереальную игру движка. Я хочу набирать "G" и "Numpad9" каждые 5 секунд в игре, но по какой-то причине "Numpad9" не работает, хотя "G" работает отлично, поэтому между этими клавишами должна быть разница. Может кто-нибудь сказать мне, что я могу сделать, чтобы это работало?
РЕДАКТИРОВАТЬ: игра не должна иметь фокус при получении входных данных!
Если кому-то это нужно, вот код, который я использую:
public class DDAutostartWave
{
public static void main(String... args)
{
DDConnection.findRightHandle();
while(true)
{
try
{
Thread.sleep(5000);
} catch(InterruptedException e)
{
e.printStackTrace();
}
DDConnection.typeKey(KeyEvent.VK_G);
DDConnection.typeKey(KeyEvent.VK_NUMPAD9);
DDConnection.typeKey(KeyEvent.VK_NUMPAD9);
}
}
}
public class DDConnection
{
private static HWND rightWindowHandle;
private static User32 USER = (User32) Native.loadLibrary("user32", User32.class, W32APIOptions.DEFAULT_OPTIONS);
public static void typeKey(int key)
{
try
{
pressKey(key);
Thread.sleep(3);
releaseKey(key);
Thread.sleep(3);
} catch(InterruptedException e)
{
e.printStackTrace();
}
}
public static void pressKey(int key)
{
WinDef.WPARAM wparam = new WinDef.WPARAM(key);
WinDef.LPARAM lparam = new WinDef.LPARAM(1 + (USER.MapVirtualKey(key, 0) << 16));
USER.SendMessageA(rightWindowHandle, 0x0100, wparam, lparam);
}
public static void releaseKey(int key)
{
WinDef.WPARAM wparam = new WinDef.WPARAM(key);
WinDef.LPARAM lparam = new WinDef.LPARAM(1 + (USER.MapVirtualKey(key, 0) << 16) + (1 << 30) + (1 << 31));
USER.SendMessageA(rightWindowHandle, 0x0101, wparam, lparam);
}
public static boolean findRightHandle()
{
rightWindowHandle = USER.FindWindow(null, "Dungeon Defenders");
if(rightWindowHandle == null) return false;
System.out.println(rightWindowHandle);
return true;
}
}
interface User32 extends com.sun.jna.platform.win32.User32
{
int MapVirtualKey(int ucode, int uMapType);
void SendMessageA(HWND handle, int message, WinDef.WPARAM wparam, WinDef.LPARAM lparam);
}