C++ Win32创建托盘运行的程序

#include "stdafx.h"
#include "StudyDuilib.h"
#include <shellapi.h>

HMENU hMenu;

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	NOTIFYICONDATA nid;
	UINT WM_TASKBARCREATED;
	POINT pt;
	int xx;
	// 不要修改TaskbarCreated,这是系统任务栏自定义的消息
	WM_TASKBARCREATED = RegisterWindowMessage(TEXT("TaskbarCreated"));
	switch (message)
	{
    case WM_CREATE://窗口创建时候的消息.
		nid.cbSize = sizeof(nid);
		nid.hWnd = hwnd;
		nid.uID = 0;
		nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
		nid.uCallbackMessage = WM_USER;
		nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
		lstrcpy(nid.szTip, APP_NAME);
		Shell_NotifyIcon(NIM_ADD, &nid);
		hMenu = CreatePopupMenu();//生成菜单
		//为托盘菜单添加两个选项
		AppendMenu(hMenu, MF_STRING, ID_SHOW, TEXT("策略更新"));
		AppendMenu(hMenu, MF_STRING, ID_RECORD, TEXT("管控记录"));
		AppendMenu(hMenu, MF_STRING, ID_ABOUT, TEXT("关于"));
		Shell_NotifyIcon(NIM_ADD, &nid);
		break;
    case WM_USER://连续使用该程序时候的消息.
		if (lParam == WM_LBUTTONDOWN)
			MessageBox(hwnd, TEXT("Win32 API 实现系统托盘程序,双击托盘可以退出!"), 	APP_NAME, MB_OK);
		if (lParam == WM_LBUTTONDBLCLK)//双击托盘的消息,退出.
			SendMessage(hwnd, WM_CLOSE, wParam, lParam);
		if (lParam == WM_RBUTTONDOWN)
		{
			GetCursorPos(&pt);//取鼠标坐标
			::SetForegroundWindow(hwnd);//解决在菜单外单击左键菜单不消失的问题
			//EnableMenuItem(hMenu, ID_SHOW, MF_GRAYED);//让菜单中的某一项变灰
			xx = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, NULL, hwnd, NULL);//显示菜单并获取选项ID
			if (xx == ID_SHOW) MessageBox(hwnd, TEXT("策略更新"), APP_NAME, MB_OK);
			if (xx == ID_RECORD) MessageBox(hwnd, TEXT("管控记录"), APP_NAME, MB_OK);
			if (xx == ID_ABOUT) MessageBox(hwnd, TEXT("关于"), APP_NAME, MB_OK);
			if (xx == 0) PostMessage(hwnd, WM_LBUTTONDOWN, NULL, NULL);
		}
		break;
    case WM_DESTROY://窗口销毁时候的消息.
		Shell_NotifyIcon(NIM_DELETE, &nid);
		PostQuitMessage(0);
		break;
    default:
		/*
		*   防止当Explorer.exe 崩溃以后,程序在系统系统托盘中的图标就消失
            原理:Explorer.exe 重新载入后会重建系统任务栏。当系统任务栏建立的时候会向系统内
            所有注册接收TaskbarCreated 消息的顶级窗口发送一条消息,我们只需要捕捉这个消		
            息,并重建系统托盘的图标即可。
		*/
		if (message == WM_TASKBARCREATED)
			SendMessage(hwnd, WM_CREATE, wParam, lParam);
		break;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;

	HWND handle = FindWindow(NULL, APP_NAME);
	if (handle != NULL)
	{
		MessageBox(NULL, TEXT("Application is already running"), APP_NAME, MB_ICONERROR);
		return 0;
	}

	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = NULL;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = APP_NAME;

	if (!RegisterClass(&wndclass))
	{
		MessageBox(NULL, TEXT("This program requires Windows NT!"), APP_NAME, MB_ICONERROR);
		return 0;
	}
    // 此处使用WS_EX_TOOLWINDOW 属性来隐藏显示在任务栏上的窗口程序按钮
	hwnd = CreateWindowEx(WS_EX_TOOLWINDOW,
		APP_NAME, APP_NAME,
		WS_POPUP,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL, NULL, NULL, NULL);

	ShowWindow(hwnd, 0);
	UpdateWindow(hwnd);

	//消息循环
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 0;
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Win32控制台托盘是一种用于在Windows操作系统中的控制台应用程序中添加托盘图标的技术。 Win32是一种面向Windows平台的编程技术。它提供了一套应用程序编程接口(API),开发人员可以使用这些接口来创建和管理Windows应用程序。使用Win32编程技术,开发人员可以通过编写C语言或C++代码来实现控制台应用程序控制台应用程序是一种以命令行界面为基础的应用程序,通常通过命令行窗口来操作和显示结果。然而,控制台应用程序通常不支持图形用户界面(GUI)的特性,例如窗口和图标。 然而,通过使用Win32控制台托盘技术,开发人员可以在控制台应用程序中添加托盘图标。托盘图标通常显示在任务栏的系统托盘区域,提供快速访问应用程序的功能。 要实现Win32控制台托盘,开发人员需要使用Win32 API中的相关函数和消息。例如,可以使用Shell_NotifyIcon函数来添加、修改或删除托盘图标,使用Shell_NotifyIcon消息来处理托盘图标的操作和事件。 使用Win32控制台托盘技术,开发人员可以为控制台应用程序添加更多的交互性和易用性。用户可以通过右击托盘图标来打开菜单,执行一些预定义的操作,例如显示控制台窗口、关闭应用程序等。 总而言之,Win32控制台托盘是一种在控制台应用程序中实现托盘图标的技术。通过使用相关的Win32 API函数和消息,开发人员可以为控制台应用程序添加更多的用户交互性和易用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_君莫笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值