当前位置: 首页 > 知识库问答 >
问题:

JNA用户32。用java显示窗口。util。扫描仪不工作

仲孙景胜
2023-03-14

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

这是我的代码。

import java.util.Scanner;

导入com。太阳jna。站台win32.User32;

导入com。太阳jna。站台win32.WinDef;公共类主{

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工作。否则,程序就不会出现在屏幕上。它只是在图标栏上闪烁。我想扫描仪与系统调用或其他什么有关,所以它在干扰用户32。我想。我试过了文档上的每一个标志。(SW_SHOWNORMAL,SW_SHOWMAXIMIZED等等...)但只有SW_SHOWMAXIMIZED工作...我不想窗口最大化。

任何帮助都将不胜感激。。谢谢

共有1个答案

丁沛
2023-03-14

正如您正确假设的那样,问题的原因是扫描仪<但是问题不在于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);
    }
}
 类似资料:
  • 我对Java非常陌生,但我正在阅读《Java:如何编程》(第9版)一书,并且已经找到了一个例子,在我的一生中,我无法找出问题所在。 以下是教科书中源代码示例的(稍微)扩充版本: 我得到'NoSuchElementExcema'错误: 我理解这可能是由于源代码中的某些内容与,但我真的无法进一步推断问题所在。

  • 我有一个简单的Do-While循环,它使用的扫描器功能不正常。代码应该显示一个文本,提示用户输入字符串,用户输入字符串,然后程序再次显示相同的文本,并提示用户输入另一个字符串。 程序所做的是显示正确的消息,用户输入一个字符串,然后提示用户输入一个字符串,但用户输入之前没有文本。用户输入文本后,它就会正常工作。 查看我的代码,我看不出程序有任何理由在不向用户显示文本的情况下提示用户两次输入。

  • 问题内容: 对于Java练习,我试图创建一个程序,该程序从键盘读取整数,直到输入负数为止。 并打印整数的最大值和最小值,而忽略负数。 一旦运行,是否可以在同一程序中进行连续输入?我必须每次都继续运行该程序以输入数字。 任何帮助,将不胜感激 这是我的代码的一部分-它可以工作,但是我认为有一种更简单的方法可以执行我想要的操作,但不确定如何操作! 问题答案:

  • 对于java实践,我正在尝试创建一个程序,从键盘读取整数,直到输入负数。 它打印整数的最大值和最小值,忽略负数。 是否有一种方法可以在同一个程序运行后继续输入?每次输入一个数字,我都要继续运行程序。 任何帮助将不胜感激 这是我的代码的一部分-它可以工作,但我认为有一种更简单的方法可以做我想做的事情,但不确定如何做!

  • 我正在创建一个小算法,这是其中的一部分。 如果用户输入非整数值,我想输出一条消息,让用户再次输入一个数字: 我得到了一个永无止境的循环,我不知道为什么。 如果用户输入非整数数字,我如何识别? 如果用户输入非整数数字,我如何要求用户再次输入? 更新 当我打印异常时,我得到了InputMismatchExctive,我应该怎么做?

  • 我有一个程序,允许用户输入一个数字的学生数量,他们希望分配一个等级。然后,它打印出哪一个学生在总数中(例如6个中的1个),然后提示用户输入他们的名字和分数。 我的分数工作正确,但当最后的消息显示,我不能得到最大名称和第二个最大名称显示任何东西。