2016-08-16 7 views
1

Я хочу добиться какой-либо обработки событий для Windows. У меня есть программа, которая имеет символ в области уведомлений (системный лоток), и я хочу, чтобы программа отображалась снова, когда пользователь нажимает на значок. Есть ли простой способ реализовать это в C++ как событие? Я только нашел пути к этому в C#.Обработка событий на C++ для клика по области уведомлений Icon Windows

Это консольное приложение, и я хочу изменить как можно меньше вещей. Насколько мне известно, обработчика WndProc для консольного приложения нет.

+0

Почему нет 'WndProc'? Консольное приложение является идеальным приложением win32, и оно может использовать 'RegisterClass',' CreateWindow' и т. Д. – ikh

ответ

1

Почему нет 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); 
} 

Возможно, вы не захотите испортить свою консольную программу с помощью цикла сообщений. Если это так, вы можете поместить код уведомления в другой поток.

+0

Я просто подумал, что с WndProc это будет невозможно. Спасибо за ответ, я попробую его как можно быстрее. – Andossus

 Смежные вопросы

  • Нет связанных вопросов^_^