Frage

In Visual Studio ich eine einfache alte Win32-Anwendung erzeugt und gestrippt alle Ressourcen und generierten Code, so dass meine Anwendung dieser besteht:

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

Wenn ich die Anwendung ausführen, das ist, was ich sehe:

Die Frage ist also kann ich das Standardanwendungssymbol in der Taskleiste ändern? Wenn ja, welcher Code hinzugefügt werden muss, es zu tun?

Edit:

Hier ist, was ich tue, und diese Art von Arbeiten, aber es ist nicht ideal. Das neue Symbol erscheint in Ordnung, aber die Taskleiste Vorschaufenster in Vista nicht funktionieren und das System-Menü funktioniert nicht so bin ich nur es jetzt allein gehen zu lassen.

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 );
}
War es hilfreich?

Lösung

Das Symbol in der Taskleiste angezeigt wird aus dem Fenster selbst genommen. Wenn das einzige Fenster die Standard-Windows-MesssageBox ist, dann werden Sie irgendeine Art von O Standard erhalten. Sie haben Ihr eigenes Fenster erstellen und ein Symbol geben, dann wird Windows verwendet diese.

Andere Tipps

Das sieht aus wie nur Beispielcode. Wenn der eigentliche Code eine nicht-Konsole Windows-Anwendung ist, können Sie dies tun:

Ihre Anwendung im Hauptfenster eine Taskleiste Symbol Geben Sie durch den Aufruf von SetIcon () . Dann, wenn Sie MessageBox () aufrufen, stellen Sie den ersten Parameter an die HWND der Anwendung des Hauptfensters.

Für diesen speziellen Fall (einen MessageBox Aufruf in der WinMain Funktion) können Sie die Meldungsfeld Dialogerstellung Haken könnten und ein Symbol dort eingestellt. Wie folgt aus:

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

Wo IDI_MYICON die ID Ihre Symbolressource ist.

WNDCLASSEX wndclass;

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

HWDN wnd = CreateWindow(...)

Warum nicht einfach ein Symbol Ressource zur EXE hinzufügen? Ich bin mir ziemlich sicher, dass Windows wird versuchen, dass vor den „generic“ Symbole fallen zurück.

Erstellen Sie ein Formular, aber nie zeigen sie es dann zuweisen ein Symbol und verwenden, die als Mutter Ihrer Nachricht Feld.

Das blendet das Symbol:

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

Das wird ein Symbol erstellen:

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");
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top