簡體   English   中英

單擊通知區域圖標Windows的C ++事件處理

[英]C++ event handling for click on notification area Icon Windows

我想為Windows實現某種事件處理。 我有一個程序,在通知區域(系統托盤)中有一個符號,當用戶點擊圖標時,我希望程序再次出現。 有沒有一種簡單的方法可以在c ++中實現它作為事件? 我只在C#中找到了相應的方法。

它是一個控制台應用程序,我希望盡可能少地改變它。 但據我所知,控制台應用程序沒有WndProc處理程序。

為什么沒有WndProc? 控制台應用程序是一個完美的win32應用程序,它可以使用非控制台應用程序可以使用的任何東西。

這是一個簡單但有點長的例子。

#include <windows.h>
#include <shellapi.h>

#include <iostream>
#include <cstring>

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
BOOL WINAPI ConsoleRoutine(DWORD dwCtrlType);

LPCWSTR lpszClass = L"__hidden__";

int main()
{
    HINSTANCE hInstance = GetModuleHandle(nullptr);

    WNDCLASS wc;
    HWND hWnd;
    MSG msg;

    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = nullptr;
    wc.hCursor = nullptr;
    wc.hIcon = nullptr;
    wc.hInstance = hInstance;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = lpszClass;
    wc.lpszMenuName = nullptr;
    wc.style = 0;
    RegisterClass(&wc);

    hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        nullptr, nullptr, hInstance, nullptr);

    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return static_cast<int>(msg.wParam);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    static NOTIFYICONDATA nid;

    switch (iMsg)
    {
        case WM_CREATE:
            std::memset(&nid, 0, sizeof(nid));
            nid.cbSize = sizeof(nid);
            nid.hWnd = hWnd;
            nid.uID = 0;
            nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
            nid.uCallbackMessage = WM_APP + 1;
            nid.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
            lstrcpy(nid.szTip, L"con-notify");
            Shell_NotifyIcon(NIM_ADD, &nid);
            Shell_NotifyIcon(NIM_SETVERSION, &nid);
            return 0;
        case WM_APP + 1:
            switch (lParam)
            {
                case WM_LBUTTONDBLCLK:
                    std::cout << "notify dblclk" << std::endl;
                    break;
                case WM_RBUTTONDOWN:
                case WM_CONTEXTMENU:
                    break;
            }
            break;
        case WM_DESTROY:
            Shell_NotifyIcon(NIM_DELETE, &nid);
            MessageBox(nullptr, L"asdf", L"asdf", MB_OK);
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd,iMsg,wParam,lParam);
}

您可能不希望使用消息循環搞亂控制台程序。 如果是這樣,您可以將通知代碼放入另一個線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM