我使用
在java中启动一个资源管理器窗口ProcessBuilder pb = new ProcessBuilder("explorer.exe",folderToOpen);
Process p = pb.start();
在我的java程序存在之前,我想关闭此窗口。 这很重要,因为这个文件夹实际上是一个虚拟文件夹。 该文件夹是使用java库创建的,用于创建内核级虚拟文件系统。 程序存在时,文件夹不再存在。 Windows资源管理器没有意识到这一点,并不断显示许多错误消息。 仅当用户关闭虚拟文件夹的资源管理器窗口时,这些错误消息才会停止。
为了获得更好的用户体验,我需要在退出时自动关闭此虚拟文件夹。
explorer.exe的问题在于,它不会在使用的实例中打开新窗口 发送命令。窗口在另一个进程中打开。所以我没有把手 到了这个过程,所以我无法关闭它。
我尝试了JNA路由,但是这引发了系统错误代码5(意味着访问被拒绝)
final String folderName = Paths.get(super.path).getFileName().toString();
final WinDef.HWND[] windowHandle = new WinDef.HWND[1];
User32.INSTANCE.EnumWindows(new WinUser.WNDENUMPROC() {
@Override
public boolean callback(WinDef.HWND hwnd, Pointer pointer) {
char[]c = new char[255];
User32.INSTANCE.GetWindowText(hwnd, c, 250);
String s = new String(c).trim();
System.out.println(s);
if (s.equals(folderName)) {
windowHandle[0] = hwnd;
User32.INSTANCE.DestroyWindow(hwnd);
System.out.println(Kernel32.INSTANCE.GetLastError());
return false;
}
return true;
}
}, Pointer.NULL);
任何建议,评论,提示,指南,想法,提示? 谢谢:D
更新: 这似乎有效,但风险在于它可能会关闭一个类似的窗口(一个窗口名称与我想要关闭的窗口相同)。这将是坏的副作用。
final String folderName = Paths.get(super.path).getFileName().toString();
User32.INSTANCE.EnumWindows(new WinUser.WNDENUMPROC() {
@Override
public boolean callback(WinDef.HWND hwnd, Pointer pointer) {
char[]c = new char[255];
User32.INSTANCE.GetWindowText(hwnd, c, 250);
String s = new String(c).trim();
System.out.println(s);
if (s.equals(folderName)) {
User32.INSTANCE.PostMessage(hwnd,User32.WM_CLOSE,null,null);
System.out.println(Kernel32.INSTANCE.GetLastError());
return false;
}
return true;
}
}, Pointer.NULL);
谁有更好的主意?
再次感谢:D
答案 0 :(得分:0)
使用destroy()
中显示的p.destroy();
。
因此请使用{{1}}