首页 > 解决方案 > 如何使用 JNA 访问此对话框“选择文件夹”

问题描述

我使用了 JNA 库和这个小 API (JnaFileChooser) https://github.com/steos/jnafilechooser

JnaFileChooser fc = new JnaFileChooser();
fc.addFilter("All Files", "*");
fc.addFilter("Pictures", "jpg", "jpeg", "png", "gif", "bmp");
if (fc.showDialog(parent)) {
File f = fc.getSelectedFile();
// do something with f

}

但是我如何使用 JNA 来访问这个拨号“选择文件夹”

在此处输入图像描述

标签: javadialogjna

解决方案


整个对话由本地控制。您正在使用的包已经在访问该对话框和该按钮。

追溯类的源代码JnaFileChooser,这个对话是WindowsFolderBrowser类的一部分。该对话框使用与SHBrowseForFolder()结合的函数出现,并在按下按钮时SHGetPathFromIDList返回。pathSelect Folder

final Pointer pidl = Shell32.SHBrowseForFolder(params);
if (pidl != null) 
    // MAX_PATH is 260 on Windows XP x32 so 4kB should
    // be more than big enough
    final Pointer path = new Memory(1024 * 4);
    Shell32.SHGetPathFromIDListW(pidl, path);
    final String filePath = path.getWideString(0);
    final File file = new File(filePath);
    Ole32.CoTaskMemFree(pidl);
    return file;
}

params传递给此函数的变量是BROWSEINFO控制对话框的本机类型。您可以在代码中看到如何为它分配了一些东西(代码的缩写版本):

final Shell32.BrowseInfo params = new Shell32.BrowseInfo();
params.hwndOwner = Native.getWindowPointer(parent);
params.ulFlags = Shell32.BIF_RETURNONLYFSDIRS | Shell32.BIF_USENEWUI;
params.lpszTitle = title;

如果要更改有关对话框的任何其他内容,则需要使用回调。其中的元素之一BROWSEINFOBFFCALLBACK lpfn;定义该函数的位置,例如params.lpfn =定义的回调函数。

的文档BFFCALLBACK表明您将使用SendMessage用于更改 OK 按钮文本的选项BFFM_SETOKTEXT


推荐阅读