在 rust 中如何获取windows文件管理当前 tab 中选中的文件路径?

纪坤 郭 0 信誉分
2024-10-15T09:17:39.1533333+00:00
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
        }
    }

上述代码能获取文件管理器所有tab中选中的文件,如何只获取当前tab中选中的文件

Windows API - Win32
Windows API - Win32
一组适用于桌面和服务器应用程序的核心 Windows 应用程序编程接口 (API)。 以前称为 Win32 API。
116 个问题
{count} 票

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。