Получение значка, связанного с запущенным приложением - PullRequest
5 голосов
/ 20 ноября 2008

Имея дескриптор окна для открытого приложения, я могу использовать функцию GetWindowText для извлечения текста из строки заголовка приложения. Я хотел бы сделать еще один шаг и получить значок, связанный с тем же приложением.

Как мне это сделать? Я просмотрел, как мне кажется, соответствующие разделы Win32 API, но у меня ничего не вышло.

Любые указатели приветствуются.

Заранее спасибо!

Ответы [ 2 ]

12 голосов
/ 20 ноября 2008
Icon ico = Icon.ExtractAssociatedIcon(theProcess.MainModule.FileName);

Из TheSoftwareJedi

Первоначально это выглядит как точная копия Как я могу получить значок из исполняемого файла только с экземпляром его Процесса в C # , но, похоже, он в основном сосредоточен на том, как его получить от внутри себя, в то время как вы можете спросить, как получить значок, используя программу, отдельную от запущенного процесса.

-Adam

5 голосов
/ 27 декабря 2012

Вы можете сделать следующее:

[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;
    }
}

Этот код возвращает маленький значок окна, который отображается рядом с текстом окна в заголовке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...