您好,即时通讯正在使用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可以工作。我不希望窗口最大化。
任何帮助将不胜感激..谢谢!
答案 0 :(得分:1)
按照您的正确假设,问题的原因是扫描仪。
但是问题不在于 showWindow()函数,而在于 SetForegroundWindow()函数。
文档规定以下内容:
当用户使用时,应用程序无法将窗口强制到前台 正在使用另一个窗口。而是,Windows闪烁任务栏 窗口中的按钮以通知用户。
因此,如果需要输入,则无法从应用程序中将此屏幕显示到前台。
该解决方案有点麻烦,但是只需简单地首先将屏幕最小化然后再恢复为普通视图,就可以将其强制显示为前台。
修改后的方法如下
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);
}
}