3

以下のコードを使用すると、メソッドを呼び出した直後にアイコンがトレイに残りremoveIconFromTray、ユーザーがトレイのアイコンに移動した後にのみアイコンが消えることがあります。

void CMyDlg::addIconToTray()
{
    static HICON hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hIcon = hIcon;
    data.hWnd = m_hWnd;
    strcpy (data.szTip, m_sTrayIconTip.c_str());
    data.uFlags = NIF_ICON | NIF_TIP;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_ADD, &data);
}

void CMyDlg::removeIconFromTray()
{
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hWnd = m_hWnd;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_DELETE, &data);

}

このコードの何が問題なのか、また、トレイからアイコンを削除するコードが機能し終わるとすぐにアイコンがトレイから消えるようにする方法を教えてください。

4

3 に答える 3

2

明らかな問題の 1 つは、構造体の初期化に失敗していることです。これを行う必要があります:

NOTIFYICONDATA data = { 0 };

それ以外は、エラーをチェックし、GetLastError を呼び出してエラーの原因を見つけます。

于 2011-11-08T14:29:24.080 に答える
0

MSDNによると:

Shell_NotifyIcon 関数

ステータス領域からアイコンを削除します。lpdata が指す NOTIFYICONDATA 構造体は、アイコンが通知領域 (NIM_ADD) に追加されたときにアイコンに最初に割り当てられた ID を使用して、削除するアイコンを識別します。

そのため、NOTIFYICONDATA の同じデータを Shell_NotifyIcon 関数に渡す必要があります。

void CMyDlg::addIconToTray()
{
    static HICON hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hIcon = hIcon;
    data.hWnd = m_hWnd;
    strcpy (data.szTip, m_sTrayIconTip.c_str());
    data.uFlags = NIF_ICON | NIF_TIP;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_ADD, &data);
}

void CMyDlg::removeIconFromTray()
{
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hIcon = hIcon;
    data.hWnd = m_hWnd;
    strcpy (data.szTip, m_sTrayIconTip.c_str());
    data.uFlags = NIF_ICON | NIF_TIP;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_DELETE, &data);

}

これで正常に動作します。または、メンバー変数にデータを保存します。

于 2015-04-03T21:39:44.647 に答える
0

DavidHeffernan が言ったように、data構造体をゼロで初期化する必要があります (Win32 API 関数に渡す構造体は常にゼロで初期化する必要があります)。

NOTIFYICONDATA data = {0};

または:

NOTIFYICONDATA data;
ZeroMemory(&data, sizeof(data));

このようにして、未使用のフィールドには一貫した予測可能な値が含まれます。あなたの場合、 を呼び出すときに をNIM_DELETE初期化していないdataため、そのuFlagsフィールドにはランダムなビットが含まれるためShell_NotifyIcon()、コンテンツを誤って解釈してNOTIFYICONDATA失敗する可能性があり、アイコンは削除されません。

于 2015-04-03T22:16:20.963 に答える