带有java.util.Scanner的JNA user32.ShowWindow不起作用

时间:2019-02-22 06:56:18

标签: java java.util.scanner jna

您好,即时通讯正在使用JNA,我想使另一个程序有焦点地显示在屏幕上,但是它不起作用。

这是我的代码。

import java.util.Scanner;

导入com.sun.jna.platform.win32.User32;

导入com.sun.jna.platform.win32.WinDef; 公共类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);
    }
}

}

此代码仅用于测试...如果没有Scanner,它可以正常工作。 但是对于扫描仪,只有SW_SHOWMAXIMIZED起作用。否则,该程序就不会出现在屏幕上。它只是在图标栏上闪烁。我认为Scanner与系统调用或其他有关,因此与user32混在一起。我认为。香港专业教育学院尝试了文档上的每个标志。(SW_SHOWNORMAL,SW_SHOWMAXIMIZED等...),但只有SW_SHOWMAXIMIZED可以工作。我不希望窗口最大化。

任何帮助将不胜感激..谢谢!

1 个答案:

答案 0 :(得分:1)

按照您的正确假设,问题的原因是扫描仪
但是问题不在于 showWindow()函数,而在于 SetForegroundWindow()函数。

文档规定以下内容:

  

当用户使用时,应用程序无法将窗口强制到前台   正在使用另一个窗口。而是,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);
    }
}