我想为Windows实现某种事件处理。 我有一个程序,在通知区域(系统托盘)中有一个符号,我希望程序再次出现,当用户点击图标。 有一种简单的方法来实现在c + +作为一个事件? 我只在C#中find了这个方法。
这是一个控制台应用程序,我想改变尽可能less的东西。 但据我所知,控制台应用程序没有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 = GetmoduleeHandle(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); }
你可能不想弄乱你的控制台程序与消息循环。 如果是这样,你可以把通知代码放到另一个线程中。