让对话框窗口在鼠标滑出时变透明

发布时间:2026/8/10 6:56:52

让对话框窗口在鼠标滑出时变透明
目录1.效果演示2.功能介绍3.实现过程3.1.鼠标滑过客户区时窗口变不透明3.2.鼠标滑出客户区时变透明3.3.鼠标滑过非客户区时变不透明3.4.鼠标滑出非客户区时变透明4.完整源码5.相关合集1.效果演示晚间正在做一个完整的公众号合集针对对话框#32770专门教学如何完善各项功能、如何优化使用体验等内容让大家在写自己的窗口项目时能够有所借鉴。2.功能介绍鼠标滑出时窗口变透明鼠标滑过时变不透明。3.实现过程如何检测鼠标在某个窗口上停留或离开本篇文章是用TrackMouseEvent函数解决此问题的同时拓展出了“让对话框窗口在鼠标滑出时变透明”功能以便让对话框窗口在视觉上有更明显的焦点效果。注意本文还涉及子类化技术和窗口消息WM_NCHITTEST的应用。如果你正在研究相关内容不妨继续看下去3.1.鼠标滑过客户区时窗口变不透明使用过VBA窗体UserForm的小伙伴基本都知道这个WM_MOUSEMOVE鼠标移动是窗口客户区的移动通知它会随着鼠标移动不停的产生。但本文的透明化需求是一次性的当鼠标在窗口内移动时只需要设置一次不透明效果就行当鼠标移动到窗口外再设置一次透明化效果。因此我们可以先创建一个全局变量Ud.IsMouseMove用于记录鼠标是否在窗口内。Ud.IsMouseMove的类型为Boolean返回True代表鼠标在窗口内False则在窗口外。所以我们仅在首个WM_MOUSEMOVE通知中设置窗口不透明效果先判断全局变量Ud.IsMouseMove仅当值为False时才执行代码随后将其立即变为True这样以后的每一个WM_MOUSEMOVE通知都不会再重复执行。3.2.鼠标滑出客户区时变透明在添加鼠标跟踪后若鼠标离开客户区就会产生WM_MOUSELEAVE通知。此时要注意鼠标从窗口的灰色空白区域移动至窗口标题栏和边框甚至窗口以外的地方等都算离开客户区。此时在添加WM_NCHITTEST消息进行判断时我们可以这样做仅当判断结果表明鼠标离开位置是在窗口以外的地方时才将窗口变透明。这里的WM_NCHITTEST消息返回值等于HTNOWHERE和HTBORDER就行。3.3.鼠标滑过非客户区时变不透明这里与WM_MOUSEMOVE通知处理类似仅在首个WM_NCMOUSEMOVE通知中设置窗口不透明效果。3.4.鼠标滑出非客户区时变透明在添加鼠标跟踪后若鼠标离开非客户区就会产生WM_NCMOUSELEAVE通知。此时要注意鼠标从窗口的非客户区移动至灰色空白区域客户区和窗口以外的地方都算离开非客户区。此时在添加WM_NCHITTEST消息进行判断时我们可以这样做仅当判断结果表明鼠标离开位置不是客户区时才将窗口变透明。这里的WM_NCHITTEST消息返回值只要不是HTCLIENT就行。4.完整源码建议大家在了解实现原理之后亲自动手编写代码实操这样才能提升自身能力。代码适配32与64位系统代码不区分WPS或EXCEL VBA环境你只需要复制代码到一个新模块中就能运行VBA晚间有雨伴人眠202608011619 原创代码转载或二创请标明来源 #If VBA7 And Win64 Then Private Declare PtrSafe Function IsWindow Lib user32 (ByVal hwnd As LongPtr) As Long Private Declare PtrSafe Function ShowWindow Lib user32 (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long Private Declare PtrSafe Function FindWindowA Lib user32 (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Private Declare PtrSafe Function CreateWindowExA Lib user32 (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal HwndParent As LongPtr, ByVal hMenu As LongPtr, ByVal Hinstance As LongPtr, lpParam As Any) As LongPtr Private Declare PtrSafe Function SetWindowLongA Lib user32 Alias SetWindowLongPtrA (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr Private Declare PtrSafe Function SetFocus Lib user32 (ByVal hwnd As LongPtr) As LongPtr Private Declare PtrSafe Function CallWindowProcA Lib user32 (ByVal lpPrevWndFunc As LongPtr, ByVal hwnd As LongPtr, ByVal msg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr Private Declare PtrSafe Function DestroyWindow Lib user32 (ByVal hwnd As LongPtr) As Long Private Declare PtrSafe Function GetWindowLongA Lib user32 Alias GetWindowLongPtrA (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Private Declare PtrSafe Function SetLayeredWindowAttributes Lib user32 (ByVal hwnd As LongPtr, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long Private Declare PtrSafe Function TrackMouseEvent Lib user32 (ByRef lpEventTrack As TrackMouseEventType) As Long Private Declare PtrSafe Function GetCursorPos Lib user32 (lpPoint As POINTAPI) As Long Private Declare PtrSafe Function SendMessageA Lib user32 (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr #Else Private Declare Function IsWindow Lib user32 (ByVal hwnd As Long) As Long Private Declare Function ShowWindow Lib user32 (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long Private Declare Function FindWindowA Lib user32 (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function CreateWindowExA Lib user32 (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal HwndParent As Long, ByVal hMenu As Long, ByVal Hinstance As Long, lpParam As Any) As Long Private Declare Function SetWindowLongA Lib user32 (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetFocus Lib user32 (ByVal hwnd As Long) As Long Private Declare Function CallWindowProcA Lib user32 (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function DestroyWindow Lib user32 (ByVal hwnd As Long) As Long Private Declare Function GetWindowLongA Lib user32 Alias GetWindowLongPtrA (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetLayeredWindowAttributes Lib user32 Alias SetLayeredWindowAttributes (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long Private Declare Function TrackMouseEvent Lib user32 (ByRef lpEventTrack As TrackMouseEventType) As Long Private Declare Function GetCursorPos Lib user32 Alias GetCursorPos (lpPoint As POINTAPI) As Long Private Declare Function SendMessageA Lib user32 Alias SendMessageA (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long #End If #If VBA7 And Win64 Then Private Type POINTAPI x As Long y As Long End Type Private Type TrackMouseEventType cbSize As Long dwFlags As Long hwndTrack As LongPtr dwHoverTime As Long End Type #Else Private Type POINTAPI x As Long y As Long End Type Private Type TrackMouseEventType cbSize As Long dwFlags As Long hwndTrack As Long dwHoverTime As Long End Type #End If #If VBA7 And Win64 Then Private Const Nuptr As LongPtr 0 Private Ud As UserDialogType Private Type UserDialogType Dialog As LongPtr DialogProc As LongPtr Editor As LongPtr EditorState As LongPtr IsMouseMove As Boolean End Type #Else Private Const Nuptr As Long 0 Private Ud As UserDialogType Private Type UserDialogType Dialog As Long DialogProc As Long Editor As Long EditorState As Long IsMouseMove As Boolean End Type #End If Private Const SW_SHOW 5 Private Const SW_HIDE 0 Private Const WS_VISIBLE H10000000 Private Const WS_POPUP H80000000 Private Const WS_SYSMENU H80000 Private Const WS_CAPTION HC00000 Private Const WS_EX_DLGMODALFRAME H1 Private Const GWL_WNDPROC -4 Private Const WM_CLOSE H10 Private Const WM_DESTROY H2 Private Const GWL_EXSTYLE -20 Private Const WS_EX_LAYERED H80000 Private Const LWA_ALPHA H2 Private Const WM_MOUSEMOVE H200 Private Const WM_MOUSELEAVE H2A3 Private Const WM_NCMOUSEMOVE HA0 Private Const WM_NCMOUSELEAVE H2A2 Private Const WM_NCHITTEST H84 Private Const HTNOWHERE 0 Private Const HTCLIENT 1 Private Const HTBORDER 18 Private Const TME_LEAVE H2 Private Const TME_NONCLIENT H10 Public Sub CreateUserDialog() 对话框窗口若已存在则直接显示 If IsWindow(Ud.Dialog) Then ShowWindow Ud.Dialog, SW_SHOW: Exit Sub 获取编辑器句柄并隐藏 Ud.Editor FindWindowA(wndclass_desked_gsk, vbNullString) Ud.EditorState ShowWindow(Ud.Editor, SW_HIDE) 指定对话框初始样式 Dim StyleS: StyleS WS_VISIBLE Or WS_POPUP Or WS_SYSMENU Or WS_CAPTION Dim StyleE: StyleE WS_EX_DLGMODALFRAME 创建对话框主窗口 Ud.Dialog CreateWindowExA(StyleE, #32770, UserDialog, StyleS, 15, 50, 300, 200, Nuptr, Nuptr, Nuptr, Nuptr) 设置分层窗口 SetWindowLongA Ud.Dialog, GWL_EXSTYLE, GetWindowLongA(Ud.Dialog, GWL_EXSTYLE) Or WS_EX_LAYERED SetLayeredWindowAttributes Ud.Dialog, 0, 255, LWA_ALPHA 设置对话框子类化 Ud.DialogProc SetWindowLongA(Ud.Dialog, GWL_WNDPROC, AddressOf WindowProcUdDialog) 设置焦点 SetFocus Ud.Dialog End Sub #If VBA7 And Win64 Then Private Function WindowProcUdDialog(ByVal hwnd As LongPtr, ByVal msg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr #Else Private Function WindowProcUdDialog(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long #End If Select Case msg 窗口即将关闭时 Case WM_CLOSE 销毁窗口 DestroyWindow Ud.Dialog 用户已处理 WindowProcUdDialog Nuptr Exit Function 窗口销毁后 Case WM_DESTROY 取消子类化 SetWindowLongA Ud.Dialog, GWL_WNDPROC, Ud.DialogProc 还原编辑器的显示状态 If Ud.EditorState Then ShowWindow Ud.Editor, SW_SHOW 清理内存 Dim EmptyUd As UserDialogType: Ud EmptyUd 用户已处理 WindowProcUdDialog Nuptr Exit Function 客户区鼠标滑过通知 Case WM_MOUSEMOVE 首次滑过时执行 If Ud.IsMouseMove False Then 鼠标滑过标识 Ud.IsMouseMove True 设置不透明窗口 SetLayeredWindowAttributes Ud.Dialog, 0, 255, LWA_ALPHA 跟踪鼠标 StartTrackMouse Ud.Dialog, TME_LEAVE End If 客户区鼠标滑出通知 Case WM_MOUSELEAVE 首次滑出时执行 If Ud.IsMouseMove True Then 鼠标滑出标识 Ud.IsMouseMove False 获取鼠标坐标 Dim mlpt As POINTAPI GetCursorPos mlpt 当鼠标在屏幕背景时 Select Case CLng(SendMessageA(Ud.Dialog, WM_NCHITTEST, Nuptr, ByVal MAKELPARAM(mlpt.x, mlpt.y))) Case HTNOWHERE, HTBORDER 设置透明窗口 SetLayeredWindowAttributes Ud.Dialog, 0, 100, LWA_ALPHA End Select 用户已处理 WindowProcUdDialog Nuptr Exit Function End If 非客户区鼠标滑过通知 Case WM_NCMOUSEMOVE 首次滑过时执行 If Ud.IsMouseMove False Then 鼠标滑过标识 Ud.IsMouseMove True 设置不透明窗口 SetLayeredWindowAttributes Ud.Dialog, 0, 255, LWA_ALPHA 跟踪鼠标 StartTrackMouse Ud.Dialog, TME_NONCLIENT Or TME_LEAVE End If 非客户区鼠标滑出通知 Case WM_NCMOUSELEAVE 首次滑出时执行 If Ud.IsMouseMove True Then 鼠标滑出标识 Ud.IsMouseMove False 获取鼠标坐标 Dim nlpt As POINTAPI GetCursorPos mlpt 当鼠标不在客户区时 If CLng(SendMessageA(Ud.Dialog, WM_NCHITTEST, Nuptr, ByVal MAKELPARAM(nlpt.x, nlpt.y))) HTCLIENT Then 设置透明窗口 SetLayeredWindowAttributes Ud.Dialog, 0, 100, LWA_ALPHA End If 用户已处理 WindowProcUdDialog Nuptr Exit Function End If End Select 调用默认通知处理 WindowProcUdDialog CallWindowProcA(Ud.DialogProc, hwnd, msg, wParam, lParam) End Function #If VBA7 And Win64 Then Private Function MAKELPARAM(ByVal Low As Long, ByVal High As Long) As Long #Else Private Function MAKELPARAM(ByVal Low As Long, ByVal High As Long) As Long #End If 高低位整合 MAKELPARAM (High * 65536) Or (Low And HFFFF) End Function #If VBA7 And Win64 Then Private Function StartTrackMouse(ByVal hwnd As LongPtr, ByVal flag As Long) #Else Private Function StartTrackMouse(ByVal hwnd As Long, ByVal flag As Long) #End If 开始跟踪鼠标 Dim Tmet As TrackMouseEventType Tmet.cbSize LenB(Tmet) Tmet.dwFlags flag Tmet.dwHoverTime 10 Tmet.hwndTrack hwnd StartTrackMouse TrackMouseEvent(Tmet) End Function5.相关合集关于#32770对话框窗口的专项开发计划

相关新闻

工控领域高可靠TCP客户端设计与实现

工控领域高可靠TCP客户端设计与实现

2026/8/10 6:56:52

1. 为什么工控领域需要可靠的TCP客户端?在工业自动化领域,TCP通信的可靠性直接关系到生产线的稳定运行。我经历过太多因为通信中断导致的生产事故:某汽车厂焊装车间因为一个数据包丢失导致整条生产线停机2小时,损失近百万&#xf…

技术任务中的无痕实践:从资源清理到工程素养的系统性方法

技术任务中的无痕实践:从资源清理到工程素养的系统性方法

2026/8/10 6:46:51

你拿到一个项目,标题是“【杜马探案记-S2E17】《蛇灵完成任务后绝不给对手留下任何蛛丝马迹》”。项目正文、关键词、摘要描述全是空的,只给了这个标题。这看起来像是一个系列剧集或故事的某一集标题,充满了悬疑和侦探色彩。但我们的任务不是…

本地AI应用部署指南:从环境配置到功能验证的完整流程

本地AI应用部署指南:从环境配置到功能验证的完整流程

2026/8/10 6:46:51

这次我们来看一个名为“外出散散步”的项目。这个名字听起来很生活化,但它实际上是一个技术项目,很可能与AI图像生成、视频处理或某种创意工具相关。从项目名称推测,它可能旨在将“散步”这一日常行为与数字内容创作结合,比如通过…

Unity热更新框架TEngine:集成HybridCLR与YooAsset的商业级开发解决方案

Unity热更新框架TEngine:集成HybridCLR与YooAsset的商业级开发解决方案

2026/8/10 8:06:55

1. 项目概述:为什么是TEngine?如果你是一名Unity开发者,尤其是经历过从零搭建项目、反复重构、或者被热更新问题折磨得焦头烂额的开发者,那么“TEngine”这个名字最近可能频繁出现在你的视野里。它被很多人称为“Unity热更新框架的…

AI学术写作工具:文献综述与知识图谱实战指南

AI学术写作工具:文献综述与知识图谱实战指南

2026/8/10 8:06:55

1. 项目概述:当学术写作遇上AI导航系统 第一次看到"学术脉络GPS"这个比喻时,我正卡在博士论文的文献综述环节。面对PubMed里检索出的387篇相关论文,那种淹没在文献海洋里的窒息感,相信每个研究者都深有体会。传统文献梳…

2026年华数杯A题微构体中填充导电介质的仿真优化解析

2026年华数杯A题微构体中填充导电介质的仿真优化解析

2026/8/10 8:06:55

很多刚接触数学建模的朋友都会卡在写作环节:逻辑混乱、语句口语化、公式解释晦涩,反复修改耗费大量时间。 我完成本次数模文章后,总结了一套高效成文方案,写作期间依靠 dabbitAI辅助梳理整篇论文结构,拆分层层递进的建…

Unity多单词顺序通关游戏开发:数据管理与进度逻辑详解

Unity多单词顺序通关游戏开发:数据管理与进度逻辑详解

2026/8/10 8:06:55

1. 项目概述与核心价值最近在整理自己的游戏开发笔记,翻到了一个几年前做的“字母拼词”小游戏项目。这个项目虽然体量不大,但麻雀虽小五脏俱全,它完整地覆盖了从UI设计、核心游戏逻辑、数据管理到最终打包发布的整个流程。更重要的是&#x…

Cocos Creator Layout组件详解:告别UI适配噩梦,实现高效自动布局

Cocos Creator Layout组件详解:告别UI适配噩梦,实现高效自动布局

2026/8/10 8:06:55

1. 项目概述:告别UI适配噩梦,Layout组件是你的终极解决方案如果你是一名Cocos Creator开发者,无论你是刚入门的新手,还是已经做过几个项目的熟手,UI界面的布局和适配问题,十有八九都让你头疼过。尤其是在今…

Elasticsearch索引管理实战与性能优化指南

Elasticsearch索引管理实战与性能优化指南

2026/8/10 7:56:54

1. 为什么需要关注Elasticsearch索引管理我第一次接触Elasticsearch时,以为只要把数据扔进去就能自动获得高性能搜索能力。直到线上系统频繁出现查询超时,才发现索引管理不当会导致严重的性能问题。一个生产环境的订单系统,由于未合理设置分片…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/10 5:58:32

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/10 7:54:12

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/10 7:19:21

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

Prometheus 监控体系深度部署:选型别只看功能清单

Prometheus 监控体系深度部署:选型别只看功能清单

2026/8/10 0:06:33

Prometheus 监控体系深度部署:选型别只看功能清单 选型场景:小规模集群直接部署 Thanos 的代价 如果为解决 15 天本地存储限制,直接部署 Thanos Sidecar、Store Gateway、Querier、Compactor、Ruler、Bucket Web 并接入 S3,就需…

ELK 日志分析平台与全链路追踪:代码评审该盯住哪些细节

ELK 日志分析平台与全链路追踪:代码评审该盯住哪些细节

2026/8/10 0:06:33

ELK 日志分析平台与全链路追踪:代码评审该盯住哪些细节 场景示例:一条 2MB 日志影响 Elasticsearch 写入 一个上传接口若执行 log.Info("Request dumped: ", r.Body),会将 2MB 的二进制 Body 写入日志。高并发下,这类超…

从零到一构建开源项目的完整历程:代码评审该盯住哪些细节

从零到一构建开源项目的完整历程:代码评审该盯住哪些细节

2026/8/10 0:06:33

从零到一构建开源项目的完整历程:代码评审该盯住哪些细节 项目进入稳定版本后,外部 Pull Request(PR)会带来新的协作成本。大范围改动混入风格重构,或修复局部问题时修改公共函数签名,都可能扩大评审和兼容…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/8 5:07:31

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/9 13:42:46

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/8 2:30:15

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…