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