JNA user32.ShowWindow с java.util.Scanner не работает - PullRequest
0 голосов
/ 22 февраля 2019

Здравствуйте, я использую JNA, и я хочу, чтобы другая программа появилась на экране с фокусом, но она не работает.

Так вот мой код.

import java.util.Scanner;

import com.sun.jna.platform.win32.User32;

import com.sun.jna.platform.win32.WinDef;public class Main {

public static void main(String args[]) {

    System.out.println("test");
    Scanner sc = new Scanner(System.in);
    int number = sc.nextInt();
    sc.close();
    System.out.println(number);

    setFocusToWindowsApp("점포관리", number);

    System.exit(0);
}

public static void setFocusToWindowsApp(String applicationTitle, int windowState) {
    //int state = User32.SW_SHOWNORMAL; // default window state (Normal)
    int state = windowState;
        switch (state) {
        default:
        case 0:
            state = User32.SW_SHOWNORMAL;
            break;
        case 1:
            state = User32.SW_SHOWMAXIMIZED;
            break;
        case 2:
            state = User32.SW_SHOWMINIMIZED;
            break;
    }

    User32 user32 = User32.INSTANCE;
    WinDef.HWND hWnd = user32.FindWindow(null, applicationTitle);
    if (user32.IsWindowVisible(hWnd)) {
        user32.ShowWindow(hWnd, state); // .SW_SHOW);
        user32.SetForegroundWindow(hWnd);
        user32.SetFocus(hWnd);
    }
}

}

этот код только для проверки ... без сканера, он работает просто отлично.но со сканером работает только SW_SHOWMAXIMIZED.В противном случае программа просто не появится на экране.он просто мигает на панели значков.я думаю, что сканер связан с системным вызовом или что-то еще, поэтому он связывается с user32.Я думаю.Я попробовал каждый флаг в документе. (SW_SHOWNORMAL, SW_SHOWMAXIMIZED и т. д.), но работает только SW_SHOWMAXIMIZED. Я не хочу, чтобы окно было развернуто.*

1 Ответ

0 голосов
/ 22 февраля 2019

Как вы правильно предположили, причина вашей проблемы в сканере .
Но проблема не в функции showWindow () , а скорее в SetForegroundWindow () function.

Документация гласит следующее:

Приложение не может принудительно вывести окно на передний план, пока пользователь работает с другим окном.Вместо этого Windows мигает кнопка панели задач окна, чтобы уведомить пользователя.

источник: Microsoft doc

Таким образом, вы не можете вывести этот экран на передний план изваше приложение, если вам требуется ввод.

Решение - это хакерское решение, но просто заставив экран сначала свернуться и затем вернуться к обычному виду, вы можете перевести его на передний план.

Модифицированный метод будет выглядеть так:

public static void setFocusToWindowsApp(String applicationTitle, int windowState) {
    int state = windowState;
        switch (state) {
        default:
        case 0:
            state = User32.SW_SHOWNORMAL;
            break;
        case 1:
            state = User32.SW_SHOWMAXIMIZED;
            break;
        case 2:
            state = User32.SW_SHOWMINIMIZED;
            break;
    }

    User32 user32 = User32.instance;
    HWND hWnd = user32.FindWindowA(null, applicationTitle);
    if (user32.IsWindowVisible(hWnd)) {
        if (state != User32.SW_SHOWMINIMIZED) {
            user32.ShowWindow(hWnd, User32.SW_SHOWMINIMIZED);
        }
        user32.ShowWindow(hWnd, state);
        user32.SetFocus(hWnd);
    }
}
...