작업 표시 줄 아이콘을 명시 적으로 설정하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1014101

  •  06-07-2019
  •  | 
  •  

문제

Visual Studio에서는 평범한 오래된 Win32 응용 프로그램을 생성하고 모든 리소스와 코드를 생성하여 응용 프로그램이 다음과 같이 구성되도록 코드를 생성했습니다.

#include "stdafx.h"
#include "IcoTest.h"

int APIENTRY _tWinMain(HINSTANCE hInstance,
                 HINSTANCE hPrevInstance,
                 LPTSTR    lpCmdLine,
                 int       nCmdShow)
{
    ::MessageBox( NULL, L"Testing", L"Test", MB_OK );
}

응용 프로그램을 실행할 때 이것이 내가 보는 것입니다.

screenshot

따라서 문제는 작업 표시 줄에서 해당 기본 응용 프로그램 아이콘을 변경할 수 있습니까? 그렇다면 어떤 코드를 추가해야합니까?

편집하다:

여기에 내가 한 일과 이런 종류의 작품이지만 이상적이지 않습니다. 새 아이콘이 잘 표시되지만 Vista의 작업 표시 줄 미리보기 창이 작동하지 않으며 시스템 메뉴가 작동하지 않으므로 지금은 내버려 둘 것입니다.

HWND CreateDummyWindow(HINSTANCE hInstance, int iconId, LPCTSTR taskbarTitle)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style          = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc    = DefWindowProc;
wcex.cbClsExtra     = 0;
wcex.cbWndExtra     = 0;
wcex.hInstance      = hInstance;
wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(iconId));
wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground  = 0;
wcex.lpszMenuName   = 0;
wcex.lpszClassName  = taskbarTitle,
wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(iconId));
ATOM atom = RegisterClassEx(&wcex);
HWND wnd = ::CreateWindow( 
    wcex.lpszClassName, taskbarTitle, WS_ICONIC | WS_DISABLED,
  -1000, -1000, 1, 1, NULL, NULL, hInstance, NULL);
return wnd;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                 HINSTANCE hPrevInstance,
                 LPTSTR    lpCmdLine,
                 int       nCmdShow)
{
    HWND wnd = CreateDummyWindow(hInstance, IDI_ICON1, _T("Test") );
    ::MessageBox( wnd, _T("Testing"), _T("Test"), MB_OK );
    ::DestroyWindow( wnd );
}
도움이 되었습니까?

해결책

작업 표시 줄에 표시된 아이콘은 창 자체에서 가져옵니다. 유일한 창이 표준 Windows MesssageBox라면 OS 기본값이 있습니다. 나만의 창을 만들고 아이콘을 주어야합니다. 그러면 Windows가 그것을 사용합니다.

다른 팁

이것은 단지 샘플 코드처럼 보입니다. 실제 코드가 소요되지 않은 Windows 애플리케이션 인 경우 다음을 수행 할 수 있습니다.

응용 프로그램의 기본 창을 호출하여 작업 표시 줄 아이콘을 제공하십시오. seticon (). 그런 다음 MessageBox ()를 호출하면 첫 번째 매개 변수를 응용 프로그램의 기본 창의 HWND로 설정하십시오.

이 특별한 경우 (하나 MessageBox 전화로 전화하십시오 WinMain 기능) 메시지 상자 대화 상자 생성을 연결하고 아이콘을 설정할 수 있습니다. 이와 같이:

HHOOK g_hMsgBoxHook;
HINSTANCE g_hInstance;

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode == HC_ACTION)
    {
        CWPSTRUCT* pcwp = (CWPSTRUCT*)lParam;

        if(pcwp->message == WM_INITDIALOG)
        {
            HICON hIcon = NULL;
            HICON hIconBig = NULL;

            // Small icon.
            hIcon = (HICON)LoadImage(g_hInstance,
                           MAKEINTRESOURCE(IDI_MYICON),
                           IMAGE_ICON,
                           GetSystemMetrics(SM_CXSMICON),
                           GetSystemMetrics(SM_CYSMICON),
                           0);
            if(hIcon)
            {
                SendMessage(pcwp->hwnd, WM_SETICON,
                    ICON_SMALL, (LPARAM)hIcon);
            }

            // Big icon.
            hIconBig = (HICON)LoadImage(g_hInstance,
                           MAKEINTRESOURCE(IDI_MYICON),
                           IMAGE_ICON,
                           GetSystemMetrics(SM_CXICON),
                           GetSystemMetrics(SM_CXICON),
                           0);
            if(hIconBig)
            {
                SendMessage(pcwp->hwnd, WM_SETICON,
                    ICON_BIG, (LPARAM)hIconBig);
            }
        }
    }

    return CallNextHookEx(g_hMsgBoxHook, nCode, wParam, lParam); 
}

int CALLBACK wWinMain(
  HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPWSTR lpCmdLine,
  int nCmdShow
)
{
    g_hInstance = hInstance;
    g_hMsgBoxHook = SetWindowsHookEx(WH_CALLWNDPROC,
        CallWndProc, NULL, GetCurrentThreadId());

    MessageBoxW(NULL, L"Testing", L"Test", MB_OK);

    // ...

    UnhookWindowsHookEx(g_hMsgBoxHook);
}

어디에 IDI_MYICON 아이콘 리소스의 ID입니다.

WNDCLASSEX wndclass;

wndclass.cbSize        = sizeof(wndclass);
// ..
wndclass.hIconSm       = ExtractIconEx( ... );
RegisterClassEx(&wndclass);

HWDN wnd = CreateWindow(...)

EXE에 아이콘 리소스를 추가하지 않겠습니까? 나는 "일반적인"아이콘으로 돌아 가기 전에 Windows가 그것을 시도 할 것이라고 확신합니다.

양식을 만들지 만 표시하지 말고 아이콘을 할당하여 메시지 상자의 부모로 사용하십시오.

이것은 아이콘을 숨 깁니다.

using (var f = new Form())
{
    MessageBox.Show(f,"my message");
}

이것은 아이콘을 만듭니다.

using (var f = new Form())
{
    f.Icon = Resources.IconUpload;
    f.Location=new Point(-1000,-1000);
    f.StartPosition = FormStartPosition.Manual;
    f.Show();
    MessageBox.Show(f,"my message");
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top