关闭从Java创建的资源管理器窗口

时间:2014-05-07 06:10:19

标签: java windows winapi jna explorer

我使用

在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

1 个答案:

答案 0 :(得分:0)

使用destroy()中显示的p.destroy();

因此请使用{{1}}

相关问题