5

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

アプリケーションを実行すると、次のように表示されます。

スクリーンショット

問題は、タスクバーのデフォルトのアプリケーションアイコンを変更できるかどうかです。もしそうなら、それを行うためにどのコードを追加する必要がありますか?

編集:

これが私がしたことであり、この種の作品ですが、それは理想的ではありません。新しいアイコンは正常に表示されますが、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 );
}
4

6 に答える 6

3

タスクバーに表示されるアイコンは、ウィンドウ自体から取得されます。唯一のウィンドウが標準のWindowsMesssageBoxである場合は、ある種のOSのデフォルトが表示されます。独自のウィンドウを作成してアイコンを付ける必要があります。そうすると、Windowsはそれを使用します。

于 2009-06-18T17:38:51.800 に答える
3

これは単なるサンプルコードのように見えます。実際のコードが非コンソールのWindowsアプリケーションである場合は、次のように実行できます。

SetIcon()を呼び出して、アプリケーションのメインウィンドウにタスクバーアイコンを表示します。次に、MessageBox()を呼び出すときに、最初のパラメーターをアプリケーションのメインウィンドウのHWNDに設定します。

于 2009-06-18T17:44:14.723 に答える
2

この特定のケース(関数MessageBoxでの1回の呼び出し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はどこにありますか。

于 2012-05-17T02:01:09.240 に答える
0
WNDCLASSEX wndclass;

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

HWDN wnd = CreateWindow(...)
于 2009-06-18T17:52:32.870 に答える
0

EXEにアイコンリソースを追加してみませんか?「一般的な」アイコンに戻る前に、Windowsがそれを試みると確信しています。

于 2009-06-18T17:57:04.093 に答える
-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");
}
于 2010-02-05T19:44:12.843 に答える