2009-06-18 1 views
4

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 http://i43.tinypic.com/a0c68m.png

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

편집 :

내가 한 일은 다음과 같습니다. 이런 종류의 작동은 이상적이지 않습니다. 새 아이콘이 제대로 표시되지만 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); 
} 

답변

2

작업 표시 줄에 표시된 아이콘은 창 자체에서 가져옵니다. 유일한 윈도우가 표준 Windows MesssageBox 인 경우 일종의 OS 기본값을 갖게됩니다. 당신은 당신 자신의 창을 만들고 아이콘을 주어야합니다. 그러면 Windows가 그것을 사용할 것입니다.

+0

보이지 않는 창을 사용할 수 있습니까? – Skrymsli

+0

테스트를 거쳐야합니다. 메시지 펌프가 주 스레드에있는 한 의심 할 여지가 있습니다. 단지 -10000, -10000 또는 이와 비슷한 위치에 양식을 보이지 않게하십시오. –

3

예제 코드처럼 보입니다. 실제 코드가 콘솔이 아닌 Windows 응용 프로그램 인 경우 다음을 수행 할 수 있습니다.

응용 프로그램의 기본 창에 SetIcon()을 호출하여 작업 표시 줄 아이콘을 지정합니다. 그런 다음 MessageBox()를 호출하면 첫 번째 매개 변수를 응용 프로그램의 주 윈도우의 HWND로 설정합니다.

+0

사실, 샘플을 이렇게 만들었습니다. 창을 표시하는 COM 개체가 있습니다. 내 응용 프로그램은 실제로 직접 창을 만들지 않습니다. 작업 표시 줄의 아이콘은 com 객체의 창에서 엉뚱한 것입니다. – Skrymsli

+0

당신의 대답은 SetIcon에서 더 열심히 보였습니다. COM 객체에서 창 핸들을 얻을 수 있다는 것을 알게되었습니다. :: SendMessage (wnd, WM_SETICON, FALSE, (LPARAM) hIcon); 그리고 그 작품! – Skrymsli

+0

니스. COM이 보이지 않는 창을 만들었다는 것을 알았지 만,이 방법으로 사용할 수 있는지 몰랐습니다. 업데이트 주셔서 감사합니다. –

0
WNDCLASSEX wndclass; 

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

HWDN wnd = CreateWindow(...) 
0

EXE에 아이콘 리소스를 추가하지 않는 이유는 무엇입니까? 나는 Windows가 "일반적인"아이콘으로 떨어지기 전에 그것을 시도 할 것이라고 확신한다.

+0

나는 그것을 시험해 보았다. 당신이 제안하는 것이 효과가있을 수 있도록 아이콘을 추가하는 특별한 방법이 있습니까? 나는 그것을 작동시킬 수 없었다. – Skrymsli

-3

양식을 만들었지 만 표시하지 마십시오. 아이콘을 지정하고이를 메시지 상자의 부모로 사용하십시오. 이 아이콘이 생성됩니다

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"); 
} 
+0

이것은 C++이 아니며 Windows API를 대상으로하지도 않습니다. – IInspectable

2

을합니다 (WinMain 기능의 하나 MessageBox 전화) 메시지 상자 대화 상자 만들기 후크 수

는 아이콘을 숨 깁니다 그곳에 아이콘을 설정하십시오. 이와 같이 :

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입니다.