java - 如何使用 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 来访问这个拨号“选择文件夹”
解决方案
整个对话由本地控制。您正在使用的包已经在访问该对话框和该按钮。
追溯类的源代码JnaFileChooser
,这个对话是WindowsFolderBrowser
类的一部分。该对话框使用与SHBrowseForFolder()
结合的函数出现,并在按下按钮时SHGetPathFromIDList
返回。path
Select 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;
如果要更改有关对话框的任何其他内容,则需要使用回调。其中的元素之一BROWSEINFO
是BFFCALLBACK lpfn;
定义该函数的位置,例如params.lpfn =
定义的回调函数。
的文档BFFCALLBACK
表明您将使用SendMessage
用于更改 OK 按钮文本的选项BFFM_SETOKTEXT
。
推荐阅读
- python - 使用 http.client 登录在线 Farasa lemmatizer 并对内容进行词形还原
- python - 我怎样才能避免对这个图路径搜索使用深拷贝
- python - Tensorflow Beta 2.0 中的 tf.keras 是否支持自动混合精度?
- python - 如何遍历文件列表并打开每个文件
- javascript - 如何在反应中将文件传递给后端api
- c# - Visual Studio MacOS - 如何排除异常情况
- webpack - 如何“编译”一个模块?
- python - 检查一个对象是否是来自 python 的 boost python 对象
- python - 'RootLayout' 对象没有属性 'image'
- python - 将html中的文本直接提取到变量中