我需要在 Windows 资源管理器中获取所有选定的文件和文件夹。我正在使用 com4j 访问 win Shell32 API (感谢 Tom91136,如果您需要了解如何安装和初始化 com4j ,请参考此内容) 。
此代码类在 Windows 资源管理器中获取选定的文件或文件夹并打印。
import java.io.File;
import com4j.*;
import test.wsh.*;
import java.util.*;
import java.util.Timer;
import javax.swing.*;
public class DetectSelection {
public static void main(String[] argv)
{
list(); //there is a timer actually, calls every second
}
public static void list(){
System.out.println("SELECTION DETECT:");
String newResults="";
try
{
List<IWebBrowser2> browsers = getIWebBrowser2();
for(IWebBrowser2 browser : browsers){
IShellFolderViewDual3 view = getIShellFolderViewDual3(browser);
if (view != null && browser.visible()) {
FolderItems items = view.selectedItems();
for (Com4jObject object : items) {
FolderItem item = object.queryInterface(FolderItem.class);
if (item != null) {
newResults+=item.path()+" - "+item.type()+"\n\n";
}
}
}
}
}
catch(Exception error)
{
System.out.println("Error in list: "+error.toString());
}
System.out.println(newResults);
}
public static List<IWebBrowser2> getIWebBrowser2() {
// TODO this can be potentially optimized
try
{
List<IWebBrowser2> rWindows=new ArrayList<IWebBrowser2>();
IShellWindows windows = ClassFactory.createShellWindows()
.queryInterface(IShellWindows.class);
for (Com4jObject window : windows) {
IWebBrowser2 browser = window.queryInterface(IWebBrowser2.class);
rWindows.add(browser);
}
return rWindows;
}
catch(Exception error)
{
System.out.println("Error in getIWebBrowser2: "+error.toString());
return null;
}
}
public static IShellFolderViewDual3 getIShellFolderViewDual3(IWebBrowser2 browser) {
if (browser == null)
return null;
try
{
return browser.document().queryInterface(IShellFolderViewDual3.class);
}
catch(Exception error)
{
System.out.println("Error in getIShellFolderViewDual3: "+error.toString());
return null;
}
}
}
我只发布了重要的部分。我正在使用计时器定期检查打开的文件。每秒调用 list() 方法。它工作正常,但如果我关闭一个窗口,我会收到以下错误。
com4j.ComException: 80004005
.\invoke.cpp:517
at com4j.Wrapper.invoke(Wrapper.java:166)
at com.sun.proxy.$Proxy10.document(Unknown Source)
at DetectSelection.getIShellFolderViewDual3(DetectSelection.java:79)
at DetectSelection.list(DetectSelection.java:32)
Caused by: com4j.ComException: 80004005 Belirtilmemiş hata : Belirtilmemiş hata : .\invoke.cpp:517
at com4j.Native.invoke(Native Method)
at com4j.StandardComMethod.invoke(StandardComMethod.java:35)
at com4j.Wrapper$InvocationThunk.call(Wrapper.java:340)
at com4j.Task.invoke(Task.java:51)
at com4j.ComThread.run0(ComThread.java:153)
at com4j.ComThread.run(ComThread.java:134)
我开始使用 try-catch 并得到了这个:
Error in getIShellFolderViewDual3: com4j.ComException: 80004005 .\invoke.cpp:517
“IShellFolderViewDual3”方法有问题。