Разница между ключом 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);
}

0 ответов

Другие вопросы по тегам