在 rust 中如何使用 windows crate 获取文件管理当前 tab 中选中的文件路径
通过 IShellWindows 只能拿到选中的文件,但是没办法区分是哪个 tab 中选中的
fn get_select_file_path(hwnd: HWND) -> Option<String> {
// hwnd 是通过 WindowsAndMessaging::GetForegroundWindow(); 获取的当前活动窗口句柄
unsafe {
// 初始化 COM 库
let com = CoInitializeEx(None, COINIT_DISABLE_OLE1DDE);
if com.is_err() {
return None;
}
let hr: Result<IShellWindows, windows::core::Error> =
CoCreateInstance(&ShellWindows, None, CLSCTX_LOCAL_SERVER);
// let hr = CoCreateInstance(&ShellWindows, None, CLSCTX_INPROC_HANDLER);
if hr.is_err() {
println!("创建 IShellWindows 失败");
CoUninitialize(); // 清理 COM
return None; // 创建 IShellWindows 失败
}
let shell_windows = hr.unwrap();
let mut target_path = None;
let count = shell_windows.Count().unwrap_or_default();
for i in 0..count {
let variant = VARIANT::from(i);
let window: IDispatch = shell_windows.Item(&variant).ok()?;
let web_browser: IWebBrowser2 = window.cast().ok()?;
// 检查窗口是否与当前活动窗口匹配
let item_hwnd = web_browser.HWND().ok()?;
if item_hwnd.0 != hwnd.0 as isize {
continue;
}
let a = web_browser.LocationURL().ok()?;
println!("web_browser Path: {:?}", a);
// 通过IWebBrowser2获取文件夹视图并获取选中的项目
let document = web_browser.Document().ok()?;
let folder_view: IShellFolderViewDual3 = document.cast().ok()?;
let selected_items = folder_view.SelectedItems().ok()?;
let count = selected_items.Count().ok()?;
if count > 0 {
let item = selected_items.Item(&VARIANT::from(0)).ok()?;
let path = item.Path().ok()?;
target_path = Some(path.to_string());
break
}
}
// 清理 COM
CoUninitialize();
target_path
}
}
上述代码只能获得所有选中的文件