我想为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