Getting the icon associated with a running application

后端 未结 2 1512
执笔经年
执笔经年 2020-12-30 14:47

Having the window handle for an open application, I\'m able to use the GetWindowText function to retrieve the text from the title bar of the app. I would like to take this

相关标签:
2条回答
  • 2020-12-30 14:48
    Icon ico = Icon.ExtractAssociatedIcon(theProcess.MainModule.FileName);
    

    From TheSoftwareJedi

    Initially this appears to be an exact duplicate of How can I get the icon from the executable file only having an instance of it's Process in C# but that one seems to focus largely on how to get it from within it's own self, whereas you may be asking how to get the icon using a program separate from the running process.

    -Adam

    0 讨论(0)
  • 2020-12-30 15:13

    You could do the following:

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    
    [DllImport("user32.dll")]
    static extern IntPtr LoadIcon(IntPtr hInstance, IntPtr lpIconName);
    
    [DllImport("user32.dll", EntryPoint = "GetClassLong")]
    static extern uint GetClassLong32(IntPtr hWnd, int nIndex);
    
    [DllImport("user32.dll", EntryPoint = "GetClassLongPtr")]
    static extern IntPtr GetClassLong64(IntPtr hWnd, int nIndex);
    
    /// <summary>
    /// 64 bit version maybe loses significant 64-bit specific information
    /// </summary>
    static IntPtr GetClassLongPtr(IntPtr hWnd, int nIndex)
    {
        if (IntPtr.Size == 4)
            return new IntPtr((long)GetClassLong32(hWnd, nIndex));
        else
            return GetClassLong64(hWnd, nIndex);
    }
    
    
    uint WM_GETICON = 0x007f;
    IntPtr ICON_SMALL2 = new IntPtr(2);
    IntPtr IDI_APPLICATION = new IntPtr(0x7F00);
    int GCL_HICON = -14;
    
    public static Image GetSmallWindowIcon(IntPtr hWnd)
    {
        try
        {
            IntPtr hIcon = default(IntPtr);
    
            hIcon = SendMessage(hWnd, WM_GETICON, ICON_SMALL2, IntPtr.Zero);
    
            if (hIcon == IntPtr.Zero)
                hIcon = GetClassLongPtr(hWnd, GCL_HICON);
    
            if (hIcon == IntPtr.Zero)
                hIcon = LoadIcon(IntPtr.Zero, (IntPtr)0x7F00/*IDI_APPLICATION*/);
    
            if (hIcon != IntPtr.Zero)
                return new Bitmap(Icon.FromHandle(hIcon).ToBitmap(), 16, 16);
            else
                return null;
        }
        catch (Exception)
        {
            return null;
        }
    }
    

    This code retrieves the small window icon, which is shown next to the window text in the titlebar.

    0 讨论(0)
提交回复
热议问题