首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用JNA访问“选择文件夹”对话框

如何使用JNA访问“选择文件夹”对话框
EN

Stack Overflow用户
提问于 2020-07-18 19:09:40
回答 1查看 99关注 0票数 2

我用过JNA库和这个小应用程序接口(JnaFileChooser) https://github.com/steos/jnafilechooser

代码语言:javascript
复制
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访问此对话框“选择文件夹”

EN

回答 1

Stack Overflow用户

发布于 2020-07-19 22:53:09

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

通过跟踪JnaFileChooser类的源代码,此对话框是WindowsFolderBrowser类的一部分。使用结合使用SHBrowseForFolder()函数和SHGetPathFromIDList的对话框将出现,并在按下Select Folder按钮时返回path

代码语言:javascript
复制
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。您可以在代码中看到如何将一些内容分配给它(代码的缩写版本):

代码语言:javascript
复制
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选项通过BFFM_SETOKTEXT更改OK按钮文本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62967836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档