Почему мой код не может отправлять символы, такие как "@" и "~", в другое окно с помощью Java JNA? - PullRequest
0 голосов
/ 06 июля 2019

Я создаю программное обеспечение для хранения паролей, чтобы их можно было отправлять в окна входа в систему токенов. Проблема в том, что некоторые символы, такие как "@" и "~", не отправляются.

Чтобы показать вам проблему, я изменил целевое окно с окна входа в систему токена на окно редактора блокнота. Если кто-то захочет запустить приведенный ниже код, он увидит, что символ «x» отправляется в Блокнот, а «@» - нет.

import java.util.HashMap;
import java.util.Map;

import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
import com.sun.jna.Pointer;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.BaseTSD;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinUser;

public class Main {

    public static final int MAX_TITLE_LENGTH = 1024;

    public static void main(String[] args) {
        Map<HWND, String> windows = getWindows();
        for (Map.Entry<HWND,String> window : windows.entrySet()) {
            if (window.getValue().contains("Notepad")) {
                User32.INSTANCE.SetForegroundWindow( window.getKey() );
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // Prepare input reference
                WinUser.INPUT input = new WinUser.INPUT(  );
                input.type = new WinDef.DWORD( WinUser.INPUT.INPUT_KEYBOARD );
                input.input.setType("ki"); // Because setting INPUT_INPUT_KEYBOARD is not enough: https://groups.google.com/d/msg/jna-users/NDBGwC1VZbU/cjYCQ1CjBwAJ
                input.input.ki.wScan = new WinDef.WORD( 0 );
                input.input.ki.time = new WinDef.DWORD( 0 );
                input.input.ki.dwExtraInfo = new BaseTSD.ULONG_PTR( 0 );

                // Press "@" (keydown)
                input.input.ki.wVk = new WinDef.WORD( '@' ); // 0x41
                input.input.ki.dwFlags = new WinDef.DWORD( 0 );  // keydown
                User32.INSTANCE.SendInput( 
                    new WinDef.DWORD( 1 ), 
                    ( WinUser.INPUT[] ) input.toArray( 1 ), 
                    input.size() 
                );

                // Release "@"
                input.input.ki.wVk = new WinDef.WORD( '@' ); // 0x41
                input.input.ki.dwFlags = new WinDef.DWORD( 2 );  // keyup

                User32.INSTANCE.SendInput( 
                    new WinDef.DWORD( 1 ),
                    ( WinUser.INPUT[] ) input.toArray( 1 ),
                    input.size() 
                );

                // Press "x"
                input.input.ki.wVk = new WinDef.WORD( 'X' ); // 0x41
                input.input.ki.dwFlags = new WinDef.DWORD( 0 );  // keydown

                User32.INSTANCE.SendInput( 
                    new WinDef.DWORD( 1 ), 
                    ( WinUser.INPUT[] ) input.toArray( 1 ),
                    input.size() 
                );

                // Release "x"
                input.input.ki.wVk = new WinDef.WORD( 'X' ); // 0x41
                input.input.ki.dwFlags = new WinDef.DWORD( 2 );  // keyup

                User32.INSTANCE.SendInput( 
                    new WinDef.DWORD( 1 ), 
                    ( WinUser.INPUT[] ) input.toArray( 1 ), 
                    input.size() 
                );

           }
        } 
    }               

    public static Map<HWND, String> getWindows() {
        final Map<HWND, String> map = new HashMap<HWND, String>();
        User32.INSTANCE.EnumWindows(
            new WNDENUMPROC() {
                @Override
                public boolean callback(HWND hWnd, Pointer arg1) {
                    String wText = getWindowTitle(hWnd);
                    map.put(hWnd, wText);
                    return true;
                }
            },
            null
        );
        return map;
    }

    /**
     * @param hWnd
     * @return Title of a given process HWND.
     */
    public static String getWindowTitle(HWND hWnd) {
        char[] buffer = new char[MAX_TITLE_LENGTH * 2];
        User32.INSTANCE.GetWindowText(hWnd, buffer, MAX_TITLE_LENGTH);
        return Native.toString(buffer);
    }
}

Программа просто не отправляет символ «@» в Блокнот, но, с другой стороны, отправляет ему символ «x». Что я должен сделать, чтобы послать символ "@"?

...