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

问题描述 投票:1回答:1

你好〜我使用JNA,我想让另一个程序出现在屏幕上有焦点,但它不起作用。

所以这是我的代码。

import java.util.Scanner;

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

import 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与系统调用或其他任何东西有关,因此它与用户32混乱。我认为。香港专业教育学院尝试了文档上的每个标志。(SW_SHOWNORMAL,SW_SHOWMAXIMIZED等...)但只有SW_SHOWMAXIMIZED工作..我不希望窗口最大化。

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

java java.util.scanner jna
1个回答
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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.