2009-06-18 42 views
4

私は昔ながらのWin32アプリケーションを生成し、すべてのリソースを剥奪し、私のアプリケーションは、このから構成されるようにコードを生成:タスクバーアイコンを明示的に設定する方法は? Visual Studioで

#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が "generic"アイコンに落ちる前にそれを試してくれると確信しています。

+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機能の1つの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です。

関連する問題