桌面窗口知识

GetDesktopWindow获取的是顶层显示桌面句柄,也就是说,如果应用程序窗口在桌面上,那么它的窗口也算是所获取的窗口的一部分,如果使用GetDC(NULL)作图,则永远是在最顶层。

那么如何获取包含桌面图标的窗口句柄呢?

可以用spy++(vs里工具选项里有) 查看(在最底部)

可以看出窗口层次为Progman->SHELLDLL_DefView->SysListView32。于是我们可以这样来获取我们想要的窗口句柄:

注意:上述代码中没有用FindWindowW,这是因为我们需要指定从哪一个窗口往下查找。

为了移植性好。可以都做判断

 

在用以上方法获得的桌面窗口句柄上绘图,将会和桌面图标处于同一层次(即会被应用程序窗口覆盖),并且覆盖桌面图标。

 那么什么时候会出现后一种情况呢?动态桌面(桌面壁纸定时更换)的环境下便会出现。但是当你在现行环境中更改了此设置后,这种现象并不会立即出现,要想让它“现出原形”,可以注销再登录,或者干脆重启。

我曾试过在动态桌面下绘图,情况会比较糟糕——我的桌面很卡。也可能是我的代码不好。

说明一点:这里获得的桌面窗口是一个ListView控件,可以用以ListView_开头的宏操作,具体可查看MSDN文档。

1 SysListView32窗口主要是显示快捷方式等桌面上文件的。如果隐藏这个窗口,那么桌面上显示的那些东西都没有了,但是你会发现鼠标的右键还是可以打开菜单的。如果在隐藏这个窗口之后右键新建一个东西(如文件夹),则也没有显示出来,再把这个窗口Show出来,则这个刚新建文件夹就显示出来了。

2.Shelldll_defview窗口在网上的一些说法中认为主要是为了响应一些事件,在这一层可以获得焦点。将Shelldll_defview窗口隐藏后,桌面上的文件也会消失,鼠标在桌面上右击将没有任何效果。其实这样的判断是不准确的。因为可以认为是SysListView32被隐藏,而右击桌面显示的菜单只有在SysListView32窗口中显示,即可以理解为Shelldll_defview隐藏后右击是产生菜单的,而因为SysListView32被隐藏而没有看到。因此为了验证,我就设计了一个功能,将Shelldll_defview窗口缩小(缩小而缩小),在这个窗口的左上角再上一点右击桌面,使预期产生的菜单会覆盖这个窗口,而实际上我发现这个可以产生并显示菜单的窗口没有出现菜单的任何痕迹。同时我发现SysListView32因Shelldll_defview缩小而缩小,SysListView32因Shelldll_defview隐藏而不可见。

3 隐藏Progran,SysListView32和Shelldll_defview也会隐藏,但是如果改变Progman大小,SysListView32和Shelldll_defview大小却不会因此而改变。

4 对#32769窗口隐藏和显示都没有效果。

我将再生成一些窗体,使其父窗口指向桌面的四个窗口。

发现如下:

1 新建窗体,使其父窗口为SysListView32。使Syslistview32窗口前置,发现新建窗口仍然完整显示。

2 新建窗体,使其父窗口为Shelldll_defview。使Syslistview32窗口前置,发现新建窗体消失,但是隐藏SysListView32后这个窗体出现,证明SysListView32遮住了这个窗体。

3 新建窗体,使其父窗口为Progman。使Shelldll_defview窗口前置,发现新建窗体消失,但是隐藏Shelldll_defview后这个窗体出现,证明Shelldll_defview遮住了这个窗体。

4 新建窗体,使其父窗口为#32769。使Progman窗口和Shelldll_defview窗口都前置,这个新建的窗体没有发生改变。

以上可以发现SysListView32和Shelldll_defview两个窗体都不是透明的。

A 在1 2 3三个步骤中新建的窗体使用win+D是不可以最小化以显示桌面的,而4中新建的窗体可以使用win+D最小化以显示桌面。

B 同时4 3 ,开始时只显示4中新建窗口,win+D都消失,再win+D ,3和4中新建窗口都出现了。同时桌面失去焦点,继续win+D就没用了。点击桌面,win+D,4中窗口消失,3中保持不变。

C 同时4 2,开始时4中新建窗口显示而2中新建窗口不显示。win+D,4中新建窗口消失,2中窗口仍然不显示出来。

D 同时4 1,开始时1和4中新建窗口都显示出来。win+D,1和4新建窗口都消失。

这组中可以不考虑4的干扰。因为4的现象一直很稳定。

在以上的探究中,我一直不清楚这四层窗口的摆放顺序。但是如果想新建一个窗口而最少的受桌面操作的影响,就是用2中的方法。

 

如何让窗口一直显示在桌面,点击显示桌面也不会消失?

HWND hWndProgram = NULL;
HWND hWndShellDLL = NULL;
hWndProgram = ::FindWindow(_T("Progman"), _T("Program Manager"));
if(hWndProgram != NULL)
{
hWndShellDLL = FindWindowEx(hWndProgram, NULL, _T("SHELLDLL_DefView"), NULL);

//Shelldll_defview窗口在网上的一些说法中认为主要是为了响应一些事件,在这一层可以获得焦点
.}
if(hWndShellDLL != NULL)

{

SetWindowLong(m_hWnd, GWL_HWNDPARENT, (LONG)hWndShellDLL);//设置为m_hWnd的父窗体。

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值