惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
T
Tenable Blog
Project Zero
Project Zero
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
S
Schneier on Security
Scott Helme
Scott Helme
S
Securelist
Know Your Adversary
Know Your Adversary
Vercel News
Vercel News
IT之家
IT之家
V
V2EX
F
Fortinet All Blogs
Simon Willison's Weblog
Simon Willison's Weblog
K
Kaspersky official blog
博客园_首页
T
Tailwind CSS Blog
The GitHub Blog
The GitHub Blog
Spread Privacy
Spread Privacy
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
The Register - Security
The Register - Security
有赞技术团队
有赞技术团队
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cyberwarzone
Cyberwarzone
Google DeepMind News
Google DeepMind News
The Hacker News
The Hacker News
L
LINUX DO - 热门话题
Hugging Face - Blog
Hugging Face - Blog
博客园 - 三生石上(FineUI控件)
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CXSECURITY Database RSS Feed - CXSecurity.com
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CERT Recently Published Vulnerability Notes
S
SegmentFault 最新的问题
AWS News Blog
AWS News Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Vulnerabilities – Threatpost

博客园 - Zzx飘遥

发布一个注册类型库(TypeLib)的小工具 【软件发布】发布一个查单词的小工具 COM 入门(4) COM 入门(3) COM 入门(2) COM 入门(1) C#内嵌汇编代码的讨论 Deep Zoom Composer初探 ASP.NET VirtualPathProvider (下) Silverlight3离线运行 [译]理解Windows消息循环 WPF BitmapImage与byte[]的转换 VC++中启用XP主题外观 C#4.0初探:dynamic 关键字 - Zzx飘遥 - 博客园 四个字节整型转换为IP格式 - Zzx飘遥 - 博客园 拯救开启桌面效果后白屏的openSUSE 遭遇SqlDataReader锁定表 软件更新:网页设计师必备 之 网站截图工具 (附源码) C#4.0初探: Optional and named parameters
仿Win7显示桌面的工具
Zzx飘遥 · 2010-01-30 · via 博客园 - Zzx飘遥

 Win7改进了许多用户体验,其中右下角显示桌面的按钮是最舒心的功能之一。为了在没装Win7的开发机上体验这个功能,写了下面的小工具。
Win7中,鼠标拖到最右下角,点击左键,便可以显示桌面。

在用户体验上,右下角是一个无限大的区域(黄色边框范围),因为鼠标被限制在屏幕范围内;与屏幕中某块孤立范围相比,操作的命中率大大提高。
要实现这样的工具,思路非常简单:取得屏幕分辨率;在最右下角放置按钮或类似控件;点击时触发显示桌面;OK。当然还有一些细节如任务栏并不一定是在屏幕下方;最好不要影响到用户的正常操作,在用户不想看的时候甚至不要让用户看到;设置开机自动启动等。

按照这样的思路一点点实现即可。
取得任务栏,在上面添加子窗口:

hWndTray = FindWindow(TEXT("Shell_TrayWnd"), NULL);

CreateWindow(szWindowClass, szTitle, WS_CHILD,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWndTray, NULL, hInstance, NULL);

根据任务栏的位置不同,设置子窗口的位置及大小:

RECT rectTray, rectWnd;
const int CTL_LENGTH = 10; if(!GetWindowRect(hWndTray, &rectTray))
{
    MessageBox(hWnd, TEXT(
"Get task bar size failed!"), szTitle, MB_OK);
    
return FALSE;
}
if(rectTray.bottom - rectTray.top < rectTray.right - rectTray.left)
{
    
//horizon
    rectWnd.left = rectTray.right - rectTray.left - CTL_LENGTH;
    rectWnd.right
= rectWnd.left + CTL_LENGTH;
    rectWnd.top
= 0;
    rectWnd.bottom
= rectTray.bottom - rectTray.top;
}
else
{
    
//vertical
    rectWnd.left = 0;
    rectWnd.right
= rectTray.right - rectTray.left;
    rectWnd.top
= rectTray.bottom - rectTray.top - CTL_LENGTH;
    rectWnd.bottom
= rectWnd.top + CTL_LENGTH;
}

SetWindowPos(hWnd, NULL, rectWnd.left, rectWnd.top, rectWnd.right

- rectWnd.left, rectWnd.bottom - rectWnd.top, 0); 

显示桌面调用SHELL的COM对象。

IShellDispatch4 * pshDsp4;
CoCreateInstance(CLSID_Shell, NULL, CLSCTX_SERVER, IID_IDispatch, (VOID
**)&pshDsp4);
pshDsp4
->ToggleDesktop();

如果设置为自动运行,在注册表HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run下添加键值。
在程序运行中,如果主题修改或任务栏位置修改,需要更新窗口的位置,处理WM_SETTINGCHANGE消息即可。

要使子窗口透明,程序实现上比较麻烦,可以阻止系统对WM_ERASEBKGND消息的默认处理,以达到窗口“透明”的目的(不处理背景重绘,当然某些情况下会显示不正常)。

最终运行截图:(点右键显示的菜单)

在WinXP,Win7简单测试通过。

源码及可执行程序下载:点击下载