JNA用户32.与Java.util.Scanner showwindow不起作用



你好〜我使用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);
    }
}

}

此代码仅用于测试...没有扫描仪,它的工作正常。但是使用扫描仪,只有sw_showmaximization的作品。否则,程序不会出现在屏幕上。它只是在图标栏上闪烁。我认为扫描仪与系统调用有关,因此与用户32混乱。我认为。我在文档上尝试了每个标志。

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

正如您正确假设的那样,问题的原因是 scanner
但是问题不是 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);
    }
}

最新更新