Windows 中透明窗体与系统托盘实现详解

Python桌面宠物开发实战:基于PyQt6实现透明窗口与动画交互 桌面宠物(Deskpet)是一种常驻桌面的小型交互式应用,通过透明窗体技术和事件响应机制实现角色动画与用户互动。其技术原理涉及窗口属性控制、精灵图动画帧处理和鼠标事件捕获,在GUI开发中具有重要的实践价值。PyQt6作为跨平台GUI框架,提供了WA_TranslucentBackground属性和FramelessWindowHint标志,能够实现不规则透明窗口效果。结合Sprite Animation动画系统,开发者可以创建流畅的角色动画交互。这种技术广泛应用于个性化桌面应用、游戏角色展示和轻量级工具开发 阅读详情

 自从windows2000起新的windows系统都支持,透明窗体这一特性,这个特性在windows系统上用VC编程实现起来

非常简单下面我就具体来介绍一下具体的实现步骤.

以MFC对话框程序为例其它依原理类推.

在对话框的OnInitDialog()函数中加入如下代码

    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
        GetWindowLong(
this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000); 
    HINSTANCE hInst 
= LoadLibrary("User32.DLL"); 
    
    
if(hInst) 
    { 
        typedef BOOL (WINAPI 
*MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
        MYFUNC fun 
= NULL; 
        
//取得SetLayeredWindowAttributes函数指针 
        fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); 
        
if(fun)fun(this->GetSafeHwnd(),0,128,2); 
        FreeLibrary(hInst); 
    }

下面我来解释一下这段代码的作用,首先设置窗口风格用SetWindowLong,这里要注意"^0x80000"这个是在原有

窗口风格的基础上加入新的特性,我的xp sp2 sdk中没有对这个数定义.但可以肯定这是新加入的窗口特性

也就是透明窗口的特性.但只设置了这个位,还不够,我们还需要使用SetLayeredWindowAttributes函数来设定

窗口的透明度.首先加载定义这个函数的动态连接库User32.dll.

这里我感到很奇怪,在我的SDK当中已有SetLayeredWindowAttributes函数的声明,可当我编译是连接了USER32.lib

可我直接使用SetLayeredWindowAttributes函数时还会出现"nresolved external symbol __imp__SetLayeredWindowAttributes@16" 难道是USER32的导出库中根本没有声明SetLayeredWindowAttributes,这个我不得而知,还好我们可以将他当作未声明的函数来调用,就像如上的代码一样.

好了这个就不赘述了,就是一个标准的调用未声明函数的方法.

下面我来讲讲系统托盘程序的实现方法

一样非常简单首先声明一个NOTIFYICONDATA结构体类型成员变量m_ntfd.这个结构体是系统储存托盘图标

数据的,我们要实现的是当程序最小化时将图标最小化到托盘.当双击托盘图标时,还原原窗口.

首先我们来响应窗口最小化消息,并在其中隐藏主窗口,并创建托盘图标.在OnSysCommand函数中加入如下

代码:

 

if(SC_MINIMIZE==nID)
    {
        
        memset(
&m_ntfd,0,sizeof(m_ntfd));
        m_ntfd.cbSize
=(DWORD)sizeof(NOTIFYICONDATA);
        m_ntfd.hWnd
=m_hWnd;  
        m_ntfd.uID
=IDR_MAINFRAME;
        m_ntfd.uFlags
=NIF_ICON|NIF_MESSAGE|NIF_TIP;
        m_ntfd.hIcon
=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
        m_ntfd.uCallbackMessage
=UM_CALLBACK;
        strcpy(m_ntfd.szTip,
"hello");
        
        Shell_NotifyIcon(NIM_ADD,
&m_ntfd);
        ShowWindow(SW_HIDE);
        
    }

其中NIF_ICON|NIF_MESSAGE|NIF_TIP三个标志位说明托盘图标生效,并能向主窗口(m_ntfd.hWnd=m_hWnd中定义的)发送消息.并且还会有个TIP这里我们让它显示的是"hello"

m_ntfd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));这里加载

一个托盘图标,我们用的主框架的图标.

m_ntfd.uCallbackMessage=UM_CALLBACK;这里是当托盘响应鼠标或键盘事件时发送的消息.我们将在主窗口

中响应这个消息.首先我们定义它

#define UM_CALLBACK  WM_USER+10

然后写声明消息响应函数写 MESSAGE  MAP 最后定义消息响应函数:

afx_msg void CDEMODlg::oncallback(WPARAM wParam,LPARAM lParam)
{
if(WM_LBUTTONDBLCLK==lParam)
    {
        PostMessage(WM_SYSCOMMAND,SC_RESTORE,
0);
        Shell_NotifyIcon(NIM_DELETE,
&m_ntfd);
        ShowWindow(SW_SHOW);

    }
}

这样我们所需要的功能就实现了.

两个有意思又简单的功能就说道这里了.

WinForm高级界面设计——创建透明与无边框拖动窗体 要实现自定义背景绘制,首先要理解绘制事件的触发条件和时机。通常在窗体大小改变或者窗体需要重绘时,会触发OnPaint或事件。在实现自定义背景时,关键是要正确地选择这两个方法中的一个进行覆盖。具体步骤如下:确定绘制范围:明确需要绘制的区域,是整个窗体背景还是特定区域。选择合适的绘制方法:如果需要完全自定义背景绘制,应覆盖方法,否则可以选择OnPaint方法。编写绘制代码:使用Graphics对象提供的方法进行绘制。例如,使用DrawString。 阅读详情

相关推荐

Windows系统任务栏与系统托盘图标隐藏技巧

任务栏的自动隐藏功能是一种实用的特性,它可以在不使用任务栏时自动将其隐藏,从而为工作桌面提供更多的可用空间。此功能尤其对那些屏幕尺寸有限的用户来说非常有用。自动隐藏任务栏可以在以下几种应用场景中发挥其作用:多任务处理:在处理多个应用程序时,桌面空间变得尤为宝贵。自动隐藏任务栏可以减少任务栏占据的空间,从而为打开的窗口留出更多的空间。阅读与设计工作:对于阅读电子文档或进行图形设计工作的用户来说,桌面整洁可以减少视觉干扰,提高专注度。

weixin_30674431的博客 3019

error LNK2001: unresolved external symbol “protected: virtual struct AFX_MSGMA  

项目场景: MFC订单控件,界面删除问题,报错。 问题描述: errorLNK2001:unresolvedexternalsymbol"protected:virtualstructAFX_MSGMA 原因分析: 以后百度收缩问题由于有字数限制,字数太多,后面的会自动截掉,可以试着只搜索后半部分代码问题,而不是错误Link2001,这种类型太多了,找不到适合自己的。 原因分析见http://blog.sina.com.cn/s/blog_4c4a1595010...

weixin_40677534的博客 270

VB窗体设计:创建透明与异形窗体

异形窗体,顾名思义,是指形状不规则的窗口,它打破了传统操作系统中矩形或正方形窗口的限制。异形窗体在视觉上提供了更加丰富的用户体验,能够更好地吸引用户的注意力,适用于需要突出显示效果的应用场景,比如游戏、媒体播放器、个性化软件界面等。SetWindowLong函数是Windows API中的一个重要函数,它允许程序员读取和修改一个窗口的属性。通过该函数,可以改变窗口的样式、扩展样式、类样式等。以下是该函数的参数说明:HWND hWnd: 窗口句柄,标识了要修改的窗口。int nIndex。

weixin_36073714的博客 857

error LNK2001: unresolved external symbol "protected: virtual struct AFX_EVENTSINKMAP …改正方法。

TabSheet.obj : error LNK2001: unresolved external symbol "protected: virtual struct AFX_EVENTSINKMAP const * __thiscall CTabSheet::GetEventSinkMap(void)const " (?GetEventSinkMap@CTabSheet@@MBEPBUAFX_E

一点通的专栏 2514

Unity2020,缩放到托盘、程序最小化DLL及代码实现

1. 需要修改Player -> Api Compatibility Level -> .NET 4.x; 2. WinTray脚本 : if_run(开始时自动运行,缩小到托盘);wait(等待多少运行); Hide函数,隐藏程序到托盘; 3. WinMaxAndMin脚本 : if_run(开始时自动运行,最小化);Minimize函数,最小化;Maximize函数,最大化;Restore函数,还原; 4. 默认编辑器状态下不运行,托盘的icon放置在StreamingAssets中; 5. 使用时,把WinTray预制体拖到项目中; 包含System.Deployment.dll、System.Drawing.dll、System.Windows.Forms.dll三个文件

windows系统托盘显示

windows系统托盘显示,在windows显示托盘图标。

error LNK2001: unresolved external symbol _main

如果在 ATL 组件程序中调用了 CRT 的运行时刻库函数,比如开平方 sqrt() ,那么编译的时候可能会报错“error LNK2001: unresolved external symbol _main”。怎么办?删除预定义宏“_ATL_MIN_CRT”!操作方法也见图一、图二。(vc.net 2003 中的这个项目属性叫“在 ATL 中最小使用 CRT”) 学习VC++时经常会遇到链接错误...

weixin_34220623的博客 1756

别再纠结了!手把手教你根据项目需求选对目标检测框架(MMDetection/Detectron2/YOLOv8实战对比)

本文详细对比了三大目标检测框架MMDetection、Detectron2和YOLOv8的适用场景与实战技巧,帮助开发者根据项目需求精准选型。从毕业设计到工业落地,分析不同场景下的核心需求与框架优势,提供决策树和避坑指南,确保技术选型与项目目标高度匹配。

weixin_30342209的博客 554

Windows Forms 窗体篇

1,显示窗体 非模式: Form form = new Form(); form.Show(); 模式: Form form = new Form(); form.Show(); 2,拥有者窗体与附属窗体 模式:建立隐式的拥有着与附属关系 非模式:不建立隐式附属关系,但可以显式指定 OwnedForm form = new OwnedForm(); form.Ow...

diansangjia3779的博客 473

Frida提取Cocos游戏XXTEA密钥的实战方法论

XXTEA是一种轻量级分组加密算法,广泛用于移动端游戏通信保护;其128位密钥的安全性直接决定网络协议逆向成败。在Cocos引擎生态中,密钥常以静态常量、JNI动态传递或Native运行时派生三种形态存在,导致传统静态分析失效。Frida凭借跨Java/Native注入能力与内存实时观测优势,成为捕获密钥‘出生瞬间’的关键工具——尤其适用于hook xxtea_encrypt函数入口、监控JNI参数传递、设置内存断点追踪派生过程等场景。本文聚焦Cocos2d-x与Cocos Creator项目,覆盖从密钥识

weixin_33509600的博客 416

腾讯ACE反作弊系统:内核驱动与AI行为分析如何守护游戏公平

在游戏安全领域,反作弊技术是保障公平竞技环境的核心防线。其基本原理是通过监控系统关键行为,识别并阻断非法的第三方程序干预。从技术实现看,现代反作弊方案普遍采用分层防御架构,结合用户态模块进行应用层检测,并依赖内核态驱动实现底层深度监控,以此构建纵深防御体系。这种技术的核心价值在于,它能有效对抗从简单内存修改到高级驱动级作弊等多种威胁,维护游戏经济系统和玩家体验的完整性。随着作弊手段的演进,行为分析与AI赋能变得至关重要,系统通过机器学习模型分析进程行为序列的异常模式,即使面对未知特征的外挂变种也能进行有效识

weixin_33978578的博客 742

C# 桌面时钟(透明窗体、定时提醒、开机启动)

C# 桌面时钟(透明窗体、定时提醒、开机启动)

hellogril前端库 306

SpringBoot3 + OAuth2.1实战:5分钟搞定授权码模式(含完整代码)

本文详细介绍了如何在SpringBoot3环境中快速实现OAuth2.1的授权码模式,包括环境配置、核心安全实现及完整代码示例。通过Spring Security集成,开发者可以高效构建企业级安全认证系统,解决版本兼容性问题,提升开发效率。

weixin_29216353的博客 140

WinForm窗口系统托盘闪烁,窗口透明感

private void Splashtimer_Tick(object sender, System.EventArgs e) { if ( m_bFlag == true )    {    this.notifyIcon1.Icon = m_Icon2;    m_bFlag = false;    }    else    {    this.notifyIcon1.Icon = m_Ic

学无止境 1002

MPC模型预测控制实战:从理论到代码实现(Python示例)

本文详细介绍了MPC模型预测控制的实战应用,从理论到Python代码实现。通过构建系统模型、预测方程、优化问题及约束处理,展示了如何实现一个完整的MPC控制器。文章还提供了水箱液位控制的应用案例,帮助读者掌握MPC在工业控制中的实际应用。

weixin_42653691的博客 459

腾讯滑块验证码防水墙 tdc.js 补环境实录

腾讯滑块验证码破解研究摘要 本文记录了破解腾讯防水墙滑块验证码(tdc.js)的全过程。研究重点包括: 流程分析:通过抓包分析验证码完整链路,识别出关键参数collect和eks需从tdc.js虚拟机获取 环境模拟:采用渐进式补环境方法,针对字节码虚拟机特性构建完整的window对象,包括navigator、screen、canvas等API的精确模拟 核心破解:成功调用TDC.getData()和TDC.getInfo()获取关键参数,解决POW计算和滑块缺口识别问题 优化调整:针对errorCode 5

码王吴彦祖的博客 225

【小5聊】Winform窗体开发基础知识积累

整理经常用到的一些功能知识点 1、去掉顶部工具栏 比如:最小化、最大化、以及关闭按钮 效果 代码 this.FormBorderStyle= FormBorderStyle.None 2、无边框自定义移动窗体 代码 #region 移动窗体 bool mouseDownFlag = false; int valueX = 0; int valueY = 0; Point currentFormPoint = new Point(); //坐标点 - 窗体对象 Point...

小5聊的博客 846

串口通信协议

文章目录前言一、串口通信结构图二、电平三、串口通信协议 前言 本文记录的是平时常用的串口通信有关知识点 提示:以下是本篇文章正文内容,下面案例可供参考 一、串口通信结构图 1、RS232标准串口通讯结构图 2、USB转串口通讯结构图 3、原生的串口到串口 二、电平 串口通信的时候,有三种电平:TTL电平、RS232电平、USB电平 TTL电平是从MCU直接出来的电平 RS323是一种通讯标准,因为高电平+15V低电平–15V电位差30V容错空间大,抗干扰能力强,一般用于工业设备直接通信电平转换芯

weixin_43772611的博客 6849

VB.NET制作特效窗体

窗体是Windows应用程序的基础。新一代的开发工具Visual Basic.Net为设计制作窗体提供了更多简单而丰富的方法,无需再求助于复杂而易错的API函数,我们就可以轻松制作多种特效窗体: 1 、轻松制作透明窗体 VB.NET可以轻松制作出任一透明度的窗体:我们只要在窗体的“属性”窗口中,将 Opacity 属性设置为一个介于 0.0(完全透明)与 1.0(完全不透明)之间的值就可以了:

1461

芯片研发完整全流程

芯片研发全流程可分为需求与架构设计、前端逻辑设计、后端物理设计、晶圆制造、封装测试五大阶段,涉及16个核心步骤。研发过程需要多学科交叉协作,包括微电子、物理、材料、计算机等。关键注意事项包括验证优先、工艺约束遵循、可测性设计等。芯片设计需要绘制纳米级精度的物理版图,而非传统工程图纸,需使用专业EDA工具而非KiCad这类PCB设计软件。完整研发流程具有高投入、高风险特点,需严格遵循行业标准和规范。

weixin_44520581的博客 228

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

用 c# 做msn风格的窗体

关键技术:1、做一个背景,用 Image 生成拼合背景图形可以,直接做一个竖条填充背景;2、设置 FormBorderStyle = FormBorderStyle.None,this.MainMenu1.dispose();3、在 this.Region = region;region 是一个组合的区域(在一个矩形中抠除一系列的小矩形,形成圆角矩形),如:   Rectang

1037

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForms桌面宠物开发:从零实现交互式红色金鱼

桌面应用开发是软件开发的重要分支,其核心在于创建与操作系统深度集成、提供直观用户体验的图形界面程序。在Windows平台上,C#与WinForms框架凭借其高开发效率和良好的系统兼容性,成为构建轻量级桌面工具的常用技术组合。通过窗体控制、图形绘制、多线程和事件处理等机制,开发者能够实现丰富的交互逻辑和动态视觉效果。这些技术不仅适用于传统工具软件,也能为桌面增强程序注入活力。本文以创建一个模拟真实鱼类行为的交互式桌面宠物为例,深入探讨了如何利用C# WinForms实现透明窗体、精灵动画、自然运动模拟和鼠标交

weixin_30619101的博客 360

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WPF中不规则窗体与WebBrowser控件的兼容问题解决办法

引言 这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序。 播放器普遍都要有个看起来比较酷的外观,于是我就给设计了个不规则形状的带透明边框的外观,如下图: 但这个设计整合到WPF中时,却遇到了一个头疼的BUG: 只要设置窗体为AllowsTransparency="True" WindowStyle="None",内嵌的W...

weixin_30631587的博客 105

AlwaysOnTop:让您的重要窗口永不遮挡的Windows效率神器

在繁忙的数字工作时代,您是否经常被多窗口切换困扰?当您需要同时查看代码编辑器、参考文档和聊天窗口时,重要信息总被其他应用程序遮挡,导致工作效率大打折扣。AlwaysOnTop正是为解决这一痛点而生的Windows窗口管理工具,它能让您指定的窗口始终保持在最上层,彻底告别频繁的Alt+Tab切换。🚀 ## 一、工作场景中的窗口管理痛点深度剖析 在日常办公和创作中,我们都会遇到这些令人头疼的场景

gitblog_01005的博客 230
上一篇: WinSock实现多线程网络文件传输程序(二)(MFC+WinSock 附源代码)
下一篇: 汇编语言实现的贪吃蛇,不用绘图(创新)
geniusdot
博客等级 码龄20年 23粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值