pub fn init_com() -> Result<ComGuard>Expand description
Initialize COM for the current thread in STA mode.
Returns a guard that calls CoUninitialize on drop. Keep it alive for the
lifetime of your context-menu operations.
§Errors
Returns Error::ComInit if COM has already been initialized with an
incompatible threading model.
§Example
let _com = win_context_menu::init_com()?;
// … use ContextMenu, ShellItems, etc. …Examples found in repository?
examples/enumerate.rs (line 4)
3fn main() -> win_context_menu::Result<()> {
4 let _com = init_com()?;
5
6 let path = std::env::args()
7 .nth(1)
8 .unwrap_or_else(|| r"C:\Windows\notepad.exe".to_string());
9
10 println!("Enumerating context menu items for: {}\n", path);
11
12 let items = ShellItems::from_path(&path)?;
13 let menu = ContextMenu::new(items)?;
14 let entries = menu.enumerate()?;
15
16 print_items(&entries, 0);
17
18 Ok(())
19}More examples
examples/basic.rs (line 4)
3fn main() -> win_context_menu::Result<()> {
4 let _com = init_com()?;
5
6 let path = std::env::args()
7 .nth(1)
8 .unwrap_or_else(|| r"C:\Windows\notepad.exe".to_string());
9
10 println!("Showing context menu for: {}", path);
11
12 let items = ShellItems::from_path(&path)?;
13 let menu = ContextMenu::new(items)?;
14
15 match menu.show()? {
16 Some(selected) => {
17 println!(
18 "Selected: {} (verb: {:?})",
19 selected.menu_item().label,
20 selected.menu_item().command_string
21 );
22 selected.execute()?;
23 }
24 None => println!("No item selected."),
25 }
26
27 Ok(())
28}examples/folder_background.rs (line 4)
3fn main() -> win_context_menu::Result<()> {
4 let _com = init_com()?;
5
6 let folder = std::env::args()
7 .nth(1)
8 .unwrap_or_else(|| r"C:\Windows".to_string());
9
10 println!("Showing background context menu for folder: {}", folder);
11
12 let items = ShellItems::folder_background(&folder)?;
13 let menu = ContextMenu::new(items)?;
14
15 match menu.show()? {
16 Some(selected) => {
17 println!(
18 "Selected: {} (verb: {:?})",
19 selected.menu_item().label,
20 selected.menu_item().command_string
21 );
22 selected.execute()?;
23 }
24 None => println!("No item selected."),
25 }
26
27 Ok(())
28}examples/extended.rs (line 4)
3fn main() -> win_context_menu::Result<()> {
4 let _com = init_com()?;
5
6 let path = std::env::args()
7 .nth(1)
8 .unwrap_or_else(|| r"C:\Windows\notepad.exe".to_string());
9
10 println!("Showing extended context menu (Shift+right-click) for: {}", path);
11
12 let items = ShellItems::from_path(&path)?;
13 let menu = ContextMenu::new(items)?.extended(true);
14
15 match menu.show()? {
16 Some(selected) => {
17 println!(
18 "Selected: {} (verb: {:?})",
19 selected.menu_item().label,
20 selected.menu_item().command_string
21 );
22 selected.execute()?;
23 }
24 None => println!("No item selected."),
25 }
26
27 Ok(())
28}examples/multi_select.rs (line 4)
3fn main() -> win_context_menu::Result<()> {
4 let _com = init_com()?;
5
6 let args: Vec<String> = std::env::args().skip(1).collect();
7 let paths: Vec<String> = if args.is_empty() {
8 vec![
9 r"C:\Windows\notepad.exe".to_string(),
10 r"C:\Windows\regedit.exe".to_string(),
11 ]
12 } else {
13 args
14 };
15
16 println!("Showing context menu for {} items:", paths.len());
17 for p in &paths {
18 println!(" - {}", p);
19 }
20
21 let items = ShellItems::from_paths(&paths)?;
22 let menu = ContextMenu::new(items)?;
23
24 match menu.show()? {
25 Some(selected) => {
26 println!(
27 "Selected: {} (verb: {:?})",
28 selected.menu_item().label,
29 selected.menu_item().command_string
30 );
31 selected.execute()?;
32 }
33 None => println!("No item selected."),
34 }
35
36 Ok(())
37}