C# How to determine if hwnd is in tray icons

后端 未结 3 1800
难免孤独
难免孤独 2021-01-21 18:37

I am trying to get the hwnd of the current tray icons. what I did is getting the hWnd of system trat window by using this code:

[DllImport(\"user32.dll\", SetLas         


        
相关标签:
3条回答
  • 2021-01-21 19:05

    There are no child handles. You can verify this via Spy++.

    It is not hosing sub-controls, but rendering and handling things like tooltips directly.

    enter image description here

    0 讨论(0)
  • 2021-01-21 19:07

    The 'children' of the ToolbarWindow32 are not windows. They are toolbar buttons. You'd use the TB_BUTTONCOUNT message to retrieve the number of buttons, TB_GETBUTTONINFO message to retrieve info about such a button. Quite hard to do btw since the window belongs to another process, just using SendMessage() doesn't work because the pointer isn't valid. And ultimately futile, such a button doesn't contain any information about what kind of process is associated with the icon. That's info that's buried inside the shell, you can't get to it.

    0 讨论(0)
  • 2021-01-21 19:07

    I checked that if window is opened on desktop then it has styles:

    WS_VISIBLE=true
    WS_MINIMIZE=false
    

    if window is in taskbar:

    WS_VISIBLE=true
    WS_MINIMIZE=true
    

    if window is in system tray:

    WS_VISIBLE=false
    WS_MINIMIZE=true
    

    So you can play with styles to determine if window is in tray:

    public IsWindowFromTray(hWnd)
    {    
        bool isMinimized = Win32Natives.IsIconic(hWnd);
        bool isVisible = Win32Natives.IsWindowVisible(hWnd);
    
        return isMinimized && !isVisible;
    }
    

    For the majority of apps it works.

    PS: I used pinvoke

    [DllImport("user32.dll")]
    public static extern bool IsIconic(IntPtr hWnd);
    
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool IsWindowVisible(IntPtr hWnd);
    
    0 讨论(0)
提交回复
热议问题