4

私が見たすべてによると、次の C++ プログラムでは、アプリケーション ウィンドウを左クリックすると、トレイ アイコンからバルーン ツール ヒントが表示されるはずですが、機能していません。何が欠けているのか誰か教えてもらえますか?

これは、Shell32.dll のバージョン 6.0 を使用した XP です (DllGetVersion で検証済み)。

ありがとう!

    #include "stdafx.h"
    #include "shellapi.h"

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
        MSG msg;

        WNDCLASS wc;
        memset(&wc, 0, sizeof(wc));
        wc.lpfnWndProc = WndProc;
        wc.hInstance = hInstance;
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        wc.lpszClassName = "sysTrayTest";
        RegisterClass(&wc);

        HWND hWnd = CreateWindow("sysTrayTest", "", 
                                WS_OVERLAPPEDWINDOW,
                                CW_USEDEFAULT, 0, 500, 500, 
                                NULL, NULL, hInstance, NULL);
        if (hWnd)
        {
            ShowWindow(hWnd, nCmdShow);
            while (GetMessage(&msg, NULL, 0, 0))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }

        return 0;
    }

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
            case WM_DESTROY:
            {
                NOTIFYICONDATA nid;
                memset(&nid, 0, sizeof(NOTIFYICONDATA));
                nid.cbSize = sizeof(NOTIFYICONDATA);
                nid.hWnd = hWnd;
                nid.uID = 1;
                Shell_NotifyIcon(NIM_DELETE, &nid);

                PostQuitMessage(0);
            }
            break;

            case WM_CREATE:
            {
                NOTIFYICONDATA nid;
                memset(&nid, 0, sizeof(NOTIFYICONDATA));
                nid.cbSize = sizeof(NOTIFYICONDATA);
                nid.hWnd = hWnd;
                nid.uID = 1;
                nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
                nid.uCallbackMessage = WM_USER + 200;
                nid.hIcon = LoadIcon(NULL, IDI_INFORMATION);
                lstrcpy (nid.szTip, "Test Tip");
                Shell_NotifyIcon(NIM_ADD, &nid);
            }
            break;

            case WM_LBUTTONDOWN:
            {
                NOTIFYICONDATA nid;
                memset(&nid, 0, sizeof(NOTIFYICONDATA));
                nid.cbSize = sizeof(NOTIFYICONDATA);
                nid.hWnd = hWnd;
                nid.uID = 1;
                nid.uFlags = NIF_INFO;
                lstrcpy(nid.szInfo, "Test balloon tip");
                lstrcpy(nid.szInfoTitle, "Test Title");
                nid.dwInfoFlags = NIIF_INFO;
                nid.uTimeout = 15000;
                Shell_NotifyIcon(NIM_MODIFY, &nid);
            }
            break;

            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
4

3 に答える 3

13

ああ、私はそれを理解しました。何らかの理由で、私が持っているヘッダーで...

sizeof(NOTIFYICONDATA) == 508

一方...

NOTIFYICONDATA _V3_サイズ == 504
NOTIFYICONDATA _V2_サイズ == 488
NOTIFYICONDATA _V1_サイズ == 88

sizeof(NOTIFYICONDATA) の代わりに V2 または V3 を指定すると、バルーン ヒントが正常に表示されます。

于 2009-04-22T21:58:18.347 に答える
1

以下のレジストリをチェックインしましたか...

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced

... EnableBalloonTips の場合は? ユーザーがオフにするのは非常に一般的なことです。

于 2009-04-22T04:47:43.300 に答える
1

WM_LBUTTONDOWN問題は、ユーザーがアイコンをクリックしたときにWindows が を送信すると想定していることですが、それは正しくありません。WM_LBUTTONDOWNは、ユーザーが hWnd のクライアント領域内をクリックしたときにのみ送信されます。ドキュメントを注意深く読むNOTIFYICONDATAと、ユーザーがアイコンをクリックすると Windows がWM_USER+20(コードに従って) メッセージを送信し、lParam パラメーターで取得することがわかります。WM_LBUTTONDOWN通知。

于 2011-12-01T18:17:34.793 に答える