我想爲Windows實現某種事件處理。我有一個程序,在通知區域(系統托盤)中有一個符號,我希望程序再次顯示,當用戶單擊圖標時。有沒有一種簡單的方法來實現在c + +作爲一個事件?我只能在C#中找到這種方法。點擊通知區域的C++事件處理圖標Windows
這是一個控制檯應用程序,我想盡可能少地改變。但據我所知,控制檯應用程序沒有WndProc處理程序。
我想爲Windows實現某種事件處理。我有一個程序,在通知區域(系統托盤)中有一個符號,我希望程序再次顯示,當用戶單擊圖標時。有沒有一種簡單的方法來實現在c + +作爲一個事件?我只能在C#中找到這種方法。點擊通知區域的C++事件處理圖標Windows
這是一個控制檯應用程序,我想盡可能少地改變。但據我所知,控制檯應用程序沒有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);
}
您可能不希望使用消息循環搞亂控制檯程序。如果是這樣,您可以將通知代碼放入另一個線程。
我只是認爲它不可能與WndProc。謝謝你的答案,我會盡可能快地嘗試它。 – Andossus
爲什麼沒有'WndProc'?控制檯應用程序是一個完美的win32應用程序,它可以使用'RegisterClass','CreateWindow'等。 – ikh