如何显式设置任务栏图标?

Skr*_*sli 5 c++ winapi taskbar

在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 );
}
Run Code Online (Sandbox Code Playgroud)

当我运行该应用程序时,这是我看到的:

屏幕截图

所以问题是我可以在任务栏中更改该默认应用程序图标吗?如果是这样,需要添加什么代码来做到这一点?

编辑:

这是我所做的,这类工作,但并不理想。新图标显示正常,但是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 );
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*der 4

任务栏上显示的图标取自窗口本身。如果唯一的窗口是标准的 Windows MesssageBox,那么您将获得某种操作系统默认值。您必须创建自己的窗口并给它一个图标,然后 Windows 才会使用它。