`
cwqcwk1
  • 浏览: 87290 次
文章分类
社区版块
存档分类
最新评论

Win32 API 实现系统托盘程序

 
阅读更多

托盘程序就是运行在系统托盘区域的程序,显示为桌面右下角显示区域的一个小图标。通常托盘程序带有几种功能:托盘菜单,托盘图标,气泡提示,托盘提示。例如QQ收到消息后,会在系统右下角显示闪动QQ图标。

主程序Tray.cpp

#include <windows.h>
#include "resource.h"

#define WM_TRAY (WM_USER + 100)
#define WM_TASKBAR_CREATED RegisterWindowMessage(TEXT("TaskbarCreated"))

#define APP_NAME	TEXT("托盘程序")
#define APP_TIP		TEXT("Win32 API 实现系统托盘程序")

NOTIFYICONDATA nid;		//托盘属性
HMENU hMenu;			//托盘菜单

//实例化托盘
void InitTray(HINSTANCE hInstance, HWND hWnd)
{
	nid.cbSize = sizeof(NOTIFYICONDATA);
	nid.hWnd = hWnd;
	nid.uID = IDI_TRAY;
	nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
	nid.uCallbackMessage = WM_TRAY;
	nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TRAY));
	lstrcpy(nid.szTip, APP_NAME);

	hMenu = CreatePopupMenu();//生成托盘菜单
	//为托盘菜单添加两个选项
	AppendMenu(hMenu, MF_STRING, ID_SHOW, TEXT("提示"));
	AppendMenu(hMenu, MF_STRING, ID_EXIT, TEXT("退出"));

	Shell_NotifyIcon(NIM_ADD, &nid);
}

//演示托盘气泡提醒
void ShowTrayMsg()
{
	lstrcpy(nid.szInfoTitle, APP_NAME);
	lstrcpy(nid.szInfo, TEXT("收到一条消息!"));
	nid.uTimeout = 1000;
	Shell_NotifyIcon(NIM_MODIFY, &nid);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_TRAY:
		switch(lParam)
		{
		case WM_RBUTTONDOWN:
			{
				//获取鼠标坐标
				POINT pt; GetCursorPos(&pt);

				//解决在菜单外单击左键菜单不消失的问题
				SetForegroundWindow(hWnd);

				//使菜单某项变灰
				//EnableMenuItem(hMenu, ID_SHOW, MF_GRAYED);	

				//显示并获取选中的菜单
				int cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, NULL, hWnd,
					 NULL);
				if(cmd == ID_SHOW)
					MessageBox(hWnd, APP_TIP, APP_NAME, MB_OK);
				if(cmd == ID_EXIT) 
					PostMessage(hWnd, WM_DESTROY, NULL, NULL);
			}
			break;
		case WM_LBUTTONDOWN:
			MessageBox(hWnd, APP_TIP, APP_NAME, MB_OK);
			break;
		case WM_LBUTTONDBLCLK:
			break;
		}
		break;
	case WM_DESTROY:
		//窗口销毁时删除托盘
		Shell_NotifyIcon(NIM_DELETE, &nid);
		PostQuitMessage(0);
		break;
	case WM_TIMER:
		ShowTrayMsg();
		KillTimer(hWnd, wParam);
		break;
	}
	if (uMsg == WM_TASKBAR_CREATED)
	{
		//系统Explorer崩溃重启时,重新加载托盘
		Shell_NotifyIcon(NIM_ADD, &nid);
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, 
	LPSTR /*lpCmdLine*/, int iCmdShow)
{
	HWND hWnd;
	MSG msg;
	WNDCLASS wc = { 0 };
	wc.style = NULL;
	wc.hIcon = NULL;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.lpfnWndProc = WndProc;
	wc.hbrBackground = NULL;
	wc.lpszMenuName = NULL;
	wc.lpszClassName = APP_NAME;
	wc.hCursor = NULL;

	if (!RegisterClass(&wc)) return 0;

	hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, APP_NAME, APP_NAME, WS_POPUP, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	ShowWindow(hWnd, iCmdShow);
	UpdateWindow(hWnd);

	InitTray(hInstance, hWnd);			//实例化托盘
	SetTimer(hWnd, 3, 1000, NULL);		//定时发消息,演示气泡提示功能

	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

资源头文件 resource.h

#define IDI_TRAY	101
#define ID_SHOW		40001
#define ID_EXIT		40002

资源文件 resource.rc

#include "resource.h"

IDI_TRAY ICON DISCARDABLE "ico.ico"

编译很简单,使用Visual Studio建立一个空项目,建好以上3个文件,再找一个ico图标,保存为ico.ico,即可编译。

分享到:
评论

相关推荐

    Win32 API实现系统托盘

    本篇文章将详细讲解如何利用Win32 API来实现一个具有基本功能的系统托盘,包括显示提示框、气泡提示以及上下文菜单。 首先,我们需要了解Win32 API的基本概念。Win32 API是一组用于开发Windows应用程序的函数和过程...

    vc win32 api tray program 托盘程序

    托盘程序,又称为系统托盘程序或通知区域程序,是指在任务栏右下角通知区域显示图标并提供相应功能的应用。 托盘程序通常用于后台运行,提供便捷的访问入口,而不占据主屏幕空间。它们通过创建隐藏窗口和设置其为...

    unity3d使用win32api,实现最小化,托盘运行,开机自启动,浏览文件框,隐藏标题栏

    但如果我们想要实现将其最小化到系统托盘,可以使用Win32 API中的`Shell_NotifyIcon`函数。首先,创建一个托盘图标,然后在窗口最小化时更新这个图标,并处理右键菜单事件。这使得用户即使在关闭窗口后也能通过托盘...

    win32编程之系统托盘图标显示以及弹出气泡提示

    本文将深入探讨如何利用Win32编程来实现系统托盘图标的显示及弹出气泡提示。 系统托盘图标,通常位于任务栏右下角,是许多应用程序用来提供便捷操作或状态指示的地方。它们允许用户与应用进行交互,即使应用程序主...

    使用WinAPI做系统托盘程序的应用

    总的来说,创建系统托盘程序是一个涉及到Windows编程基础和特定API知识的任务。通过理解和熟练运用WinAPI和ShellAPI,你可以构建出功能丰富的系统托盘应用,提供给用户便捷的功能访问和通知服务。

    使用PB编写系统托盘程序

    本文将详细介绍如何在PowerBuilder中利用Win32 API函数来创建一个系统托盘程序,该程序能够在用户暂时不使用或希望将程序置于后台运行时,将PowerBuilder应用程序最小化至系统托盘,并通过图标显示。 #### 二、设计...

    win32托盘图标程序源码

    在Windows编程领域,"win32托盘图标程序源码"指的是使用Win32 API(应用程序接口)编写的,能够在系统任务栏托盘区域显示图标的程序。这种程序通常用于在后台运行,提供用户交互,比如邮件客户端、音乐播放器等。让...

    C# 通过Win32的API来调用系统菜单

    这时,我们可以利用P/Invoke(Platform Invoke)技术,调用Win32 API来实现。标题“C# 通过Win32的API来调用系统菜单”涉及到的就是如何在C#应用中使用Win32 API来操作系统的系统菜单。 系统菜单通常指的是窗口的...

    系统托盘程序范例VC

    总的来说,"系统托盘程序范例VC"是一个基础的Windows编程教程,重点在于理解如何利用Win32 API在系统托盘区域创建和管理图标,以及处理与之相关的用户交互。通过学习这个示例,开发者可以进一步扩展功能,比如添加...

    一个c++做的托盘程序

    本项目是一个使用C++编写的托盘程序,托盘程序通常指的是在操作系统任务栏通知区域(通常称为系统托盘或系统 tray)运行的应用程序。这种程序可以在不占据主屏幕空间的情况下提供服务,用户可以通过点击托盘图标来与...

    Delphi Win7系统托盘_win7系统托盘_

    系统托盘是通过Windows API中的`Shell_NotifyIcon`函数来实现的,它允许程序在任务栏托盘区创建、更新或删除图标。Delphi7提供了封装这些API调用的组件,如`TTrayIcon`,使得开发人员能够轻松地在应用程序中集成系统...

    C#获取系统托盘信息

    系统托盘区域是Windows操作系统桌面右下角的一个区域,通常包含各种程序的小图标,如网络连接状态、音量控制等。这些图标代表了后台运行的进程或服务,用户可以通过它们快速访问或管理相关功能。在C#中,我们可以...

    演示了在WIN32下实现程序互斥运行的方法(24kb)

    本示例"演示了在WIN32下实现程序互斥运行的方法",涉及到的核心知识点包括: 1. **全局互斥体(Mutex)**: Mutex是多线程编程中的关键概念,用于控制对共享资源的访问。在Windows API中,我们可以使用CreateMutex()...

    系统托盘程序(c++)

    系统托盘程序是Windows操作系统中一个非常...通过学习和理解这两个部分,开发者可以了解到如何在C++环境下实现系统托盘程序,这对于开发长期运行并在后台提供服务的应用程序尤其有用,如音乐播放器、即时通讯软件等。

    VC右下角弹出框代码(Win32示例)

    在Windows编程中,右下角...总之,“VC右下角弹出框代码(Win32示例)”是一个学习和实践Windows系统托盘通知区域气泡提示的好材料,通过分析和运行示例代码,你可以深入了解Win32 API在创建这种用户界面元素时的应用。

    win32添加托盘图标.zip

    本项目“win32添加托盘图标.zip”旨在教你如何在Win32程序中实现一个系统托盘图标,并处理用户的鼠标点击事件以及右键菜单功能。以下是详细的知识点解析: 1. **系统托盘图标**:系统托盘,又称通知区域,位于...

    win32 托盘显示与闪烁

    在Windows编程中,"win32 托盘显示与闪烁"是涉及到系统任务栏通知区域(也称为系统托盘)的交互技术。这个技术允许应用程序在任务栏的右下角创建一个图标,以便用户可以快速访问或接收应用程序的通知。本文将深入...

    VC++实现托盘弹出消息窗口

    本示例关注的是如何使用VC++6.0来实现一个特定的功能:当程序运行在系统托盘区时,能够通过点击图标弹出消息窗口。这个功能常见于很多后台运行的软件,如即时通讯工具、音乐播放器等,它们通常会在任务栏右下角的...

    带右键菜单的系统托盘

    总的来说,这个项目涵盖了Windows桌面应用开发中的核心概念,包括系统托盘交互、右键菜单实现和Win32 API的使用,对于初学者来说,是一个很好的学习实例。通过这个项目,初学者可以学习到如何在Windows环境中创建...

    Vc托盘编程+源码

    托盘程序需要一个消息循环,通常是通过`GetMessage()`、`TranslateMessage()`和`DispatchMessage()`函数来实现。消息循环不断检查消息队列,处理来自用户的输入和系统事件。 **知识点五:托盘菜单** 托盘图标通常...

Global site tag (gtag.js) - Google Analytics