2016-08-16 3 views
1

Ich möchte eine Art von Event-Handling für Windows erreichen. Ich habe ein Programm mit einem Symbol im Infobereich (System Tray) und möchte, dass das Programm wieder angezeigt wird, wenn der Benutzer auf das Symbol klickt. Gibt es eine einfache Möglichkeit, das in C++ als Event zu implementieren? Ich habe nur in C# Wege dazu gefunden.C++ Event-Handling für den Klick auf den Infobereich Icon Windows

Es ist eine Konsolenanwendung und ich möchte so wenig wie möglich ändern. Aber soweit ich das beurteilen kann, gibt es keinen WndProc-Handler für die Konsolenanwendung.

+0

Warum kein 'WndProc'? Konsolen-Anwendung ist eine perfekte Win32-Anwendung, und es kann 'RegisterClass',' CreateWindow' usw. – ikh

Antwort

1

Warum kein WndProc? Konsolenanwendung ist eine perfekte Win32-Anwendung, und sie kann alles verwenden, was Nicht-Konsolen-Anwendung verwenden kann.

Hier ist ein einfaches, aber ein bisschen langes Beispiel.

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

Sie möchten wahrscheinlich nicht Ihr Konsolenprogramm mit Nachrichtenschleife vermasseln. Wenn dies der Fall ist, können Sie den Benachrichtigungscode in einen anderen Thread einfügen.

+0

Ich dachte nur, es wäre nicht mit WndProc möglich. Danke für die Antwort, ich werde es so schnell wie möglich ausprobieren. – Andossus

Verwandte Themen