Skip to main content

enumerate/
enumerate.rs

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}