显示桌面的困惑,不响应“显示桌面”(ToggleDesktop)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

需求:
在桌面放一个WS_EX_LAYERED风格的窗口,置底(一直在其他窗口下面),不响应Win+D,始终保持在桌面。

分析:
1、Win+D或者快速启动栏上的“显示桌面”,其实最终调用的是个Shell方法(IShellDispatch4.ToggleDesktop()),而且你的窗口不会收到任何与此相关的消息。
2、调用IShellDispatch4.ToggleDesktop()时,系统会给Desktop(Progman)发送一条消息 DTM_RAISE message (WM_USER + 83) ,用于把桌面置前。
3、IShellDispatch4.ToggleDesktop()还不是简单的窗口置前,我还没有找到对于这个函数的更具体的解释。(谁知道的话,一定要告诉我,谢谢~~~)


不响应“显示桌面”的解决方案:

--方案1--
将窗口设置成WS_EX_TOPMOST风格,或者用SetWindowPos(hWnd, HWND_TOPMOST, ...),都可以做到不响应“显示桌面”。

可惜,我的需求是“置底”,这个方案不适合我。

--方案2--
将窗口设置成桌面ListView的子窗口

HWND hProgman = ::FindWindow(L"Progman", L"Program Manager");
HWND hDefView = FindWindowEx(hProgman, NULL, L"SHELLDLL_DefView", NULL);
HWND hFloderViews = FindWindowEx(hDefView, NULL, L"SysListView32", NULL);
// 用hFloderViews作为CreateWindow时的父窗口就可以达到不响应“显示桌面”的效果

可惜,用这种方法,窗口继承自桌面ListView后会导致无法使用WS_EX_LAYERED窗口风格。


针对我的需求的解决方案:
方案1(可行的方案):

去掉WS_EX_LAYERED风格,把窗口设成桌面ListView的子窗口。这个方案肯定是可以的,但去掉WS_EX_LAYERED就以为着半透明窗口需要自己实现,这个就得多麻烦点。

方案2
修改需求

 

__THE END__

C#窗体钉在桌面、置底、嵌入桌面的办法 想做一个桌面时钟,钉在桌面上影响正常使用,只在看桌面的时候显示。 从网上多方寻找找到这么个代码,但是还是有方便的地方,大家探讨一下。 这个程序在使用“显示桌面”的时候还可以显示,将程序的Form1.cs改为: using System; using System.Collections.Generic; using System.ComponentModel; using Syste 阅读详情

相关推荐

C++程序使用Layered分层窗口实现视频会议中的桌面区域共享

本文详细讲述使用Layered分层窗口实现视频会议中桌面区域共享的详细实现细节。

dvlinker的技术专栏 2万+

C++ Builder XE 窗体置顶、置底设置

C++ Builder XE 窗体置顶、置底设置

lzksword的专栏 579

制作Windows游戏外挂几个有用的函数

除了很熟悉的跨进程注入(远程注入)等技术外。记录一些其它的小函数。 1、mouse_event/key_event ( SendInput ) 按键/鼠标模拟(鼠标/键盘按键精灵)、 void mouse_event( DWORD dwFlags, //具体的按键动作,如:左键、右键等。 DWORD dx, // x坐标 DWORD dy...

iMatt的专栏 1170

显示桌面

任务栏上的"显示桌面"图标消失了,处理方式:   1.在记事本,键入如下语句:[shell]  command=2  IconFile=explorer.exe,3[Taskbar]  command=ToggleDesktop   2.将此文件保存,并命名为"显示桌面.scf"Windows 98  c:/windwos/Application Data/Microsoft/Internet Explorer/Quick LaunchWindows 2000/XP  c:/Documents and Se

brian0031的专栏 489

vs2013 c++控制桌面背景,程序窗口

// hwnd.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include int _tmain(int argc, _TCHAR* argv[]) { //全部最小化窗口 CoInitialize(0); IShellDispatch4 * pdisp = NULL; CoCr

cqltbe131421的博客 817

【MFC】简单实现窗口始终置底

环境:win10,vs2017 注意这里是始终置底,是始终置顶   关于窗口持续置底,尝试了少网上方法,但都怎么适合自己的程序。于是自己想了个比较笨的方法,总算是基本实现自己想要的效果了。 下面这句代码能将窗口进行一次置底,但窗口一激活又显示了。 SetWindowPos(&wndBottom, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); ...

愿岁并谢,与长友兮 3480

点击页面中的一按钮,显示计算机桌面

当任务栏里没有“显示桌面图标”时 可在记事本中写: [Shell]Command=2IconFile=explorer.exe,3[Taskbar]Command=ToggleDesktop 备注:保存成.scf 格式 javascript:<script language="JScript"> function fnIShellDispatch4Togg...

banmeiyang1780的博客 292

显示桌面快捷方式

desktop.scf [Shell] Command=2 IconFile=explorer.exe,3 [Taskbar] Command=ToggleDesktop

roy9494的专栏 224

c# 显示桌面调用

在C#中,使用 显示桌面 的功能,实际就是使用 Shell.Application 去执行 ToggleDesktop 这个功能,代码如下: Type shellType = Type.GetTypeFromProgID("Shell.Application"); object shellObject = System.Activator.CreateInstance(shellType); shellType.InvokeMember("ToggleDesktop", System.Reflection.

qq_46603687的博客 822

FMX 窗口置顶 或置底 xe10

FMX 窗口置顶 或置底 xe10 Popup置底 StayOnTop置顶 转载于:https://www.cnblogs.com/pykill/p/11573813.html

263

.NET窗口之间的置底置顶显示

.NET窗口之间的置底置顶显示 本文的主要内容: 1、窗口之间的显示优先级 2、窗口之间的停靠以及取消停靠 简述:在一个较为复杂的系统中,往往存在多个窗口,为了使用方便,往往需要设置窗口之间的显示优先级顺序,通过查找资料,本文找到了以下几种可行的方法。 内容一:窗口之间的显示优先级 说明:如何在所有窗口中将一个窗口置顶或者置底显示,通常情况下,鼠标点击的窗口会在最前面显示,从而覆盖某些我们需要显示的其他窗口上的内容,如何避免这种情况? 方法一:利用窗口的topmost属性 窗口有一个重要的topmost属性

qq_44143897的博客 1505

css实现页面底部置底(转载)

页脚置底(Sticky footer)就是让网页的footer部分始终在浏览器窗口的底部。当网页内容足够长以至超出浏览器可视高度时,页脚会随着内容被推到网页底部;但如果网页内容够长,置底的页脚就会保持在浏览器窗口底部。 1、将内容部分的底部外边距设为负数 这是个比较主流的用法,把内容部分最小高度设为100%,再利用内容部分的负底部外边距值来达到当高度满时,页脚保持在窗口底部,当高度超出则随之推出的效果。 <body> <div class="wrapper"&g..

weixin_46221198的博客 4300

VS2017中Winform窗体中,将控件置于底层,为什么显示时在最上面?

问题描述:VS2017中,建立一个基于Winform窗体的项目,在窗口上摆放三个label控件,测试控件在布局过程中的层次性。 发现将控件置于底层,却显示时在最上面。难道这个底层就是指的是最上层? 第一步:建立窗口如下,包含3个label控件。把左侧的显示left的label控件设置“置于底层”,发现显示在最上层 第二步:把左侧的显示left的label控件设置“置于顶层”,发现显...

qq_41708281的博客 1540
上一篇: 用VC实现汉字转拼音首字母
下一篇: (转)架构师已死(转自UML软件工程组织)
debehe
博客等级 码龄22年 38粉丝 67原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值