1use win_context_menu::{init_com, ContextMenu, MenuItem, ShellItems};
2
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}
20
21fn print_items(items: &[MenuItem], depth: usize) {
22 let indent = " ".repeat(depth);
23 for item in items {
24 if item.is_separator {
25 println!("{}---", indent);
26 } else {
27 let flags = [
28 item.is_default.then_some("default"),
29 item.is_disabled.then_some("disabled"),
30 item.is_checked.then_some("checked"),
31 ]
32 .into_iter()
33 .flatten()
34 .collect::<Vec<_>>()
35 .join(",");
36
37 let verb = item
38 .command_string
39 .as_deref()
40 .map(|v| format!(" [{}]", v))
41 .unwrap_or_default();
42
43 let flag_str = if flags.is_empty() {
44 String::new()
45 } else {
46 format!(" ({})", flags)
47 };
48
49 println!(
50 "{}{}{}{} (id={})",
51 indent, item.label, verb, flag_str, item.id
52 );
53
54 if let Some(ref sub) = item.submenu {
55 print_items(sub, depth + 1);
56 }
57 }
58 }
59}