Question

Dans Visual Studio, j’ai généré une ancienne application Win32 standard, supprimé toutes les ressources et généré le code, de sorte que mon application se compose de ce qui suit:

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

Lorsque j'exécute l'application, voici ce que je vois:

 screenshot

La question est donc puis-je changer l'icône de cette application par défaut dans la barre des tâches? Si oui, quel code faut-il ajouter pour le faire?

Modifier:

Voici ce que j'ai fait et ce genre de travail fonctionne mais ce n'est pas idéal. La nouvelle icône apparaît bien, mais la fenêtre d'aperçu de la barre des tâches de Vista ne fonctionne pas et le menu système ne fonctionne pas. Je vais donc simplement la laisser pour l'instant.

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 );
}
Était-ce utile?

La solution

L'icône affichée dans la barre des tâches provient de la fenêtre elle-même. Si la seule fenêtre est la MesssageBox Windows standard, vous obtiendrez une sorte de système d'exploitation par défaut. Vous devez créer votre propre fenêtre et lui attribuer une icône. Windows l'utilisera ensuite.

Autres conseils

Cela ressemble à un exemple de code. Si le code réel est une application Windows non console, procédez comme suit:

Attribuez une icône de barre des tâches à la fenêtre principale de votre application en appelant SetIcon () . Ensuite, lorsque vous appelez MessageBox (), définissez le premier paramètre sur le HWND de la fenêtre principale de votre application.

Dans ce cas particulier (un appel MessageBox dans la fonction WinMain ), vous pouvez accrocher la création de la boîte de dialogue de boîte de message et y définir une icône. Comme ceci:

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 est l'ID de votre ressource icon.

WNDCLASSEX wndclass;

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

HWDN wnd = CreateWindow(...)

Pourquoi ne pas simplement ajouter une ressource icône à l’EXE? Je suis pratiquement sûr que Windows essaiera cette solution avant de revenir au paramètre "générique". icônes.

Créez un formulaire mais ne le montrez jamais, puis attribuez-lui une icône et utilisez-le comme parent de votre boîte de message.

Ceci cache l'icône:

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

Ceci créera une icône:

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");
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top