最近因业务需要,玩了一下全屏问题。后来,对windows xp sp2的桌面窗口产生了兴趣。写了段代码,玩了一下。同时结合网上的一些知识,发现了以下一些现象。(转载请指明出处)
首先窗口名有#32769、Progman、Shelldll_defview和SysListView32。从第一个到最后一个都是成父子关系。可以通过
代码语言:javascript复制m_pwnd = GetDesktopWindow();
m_hDesktop_Progran = ::FindWindow( _T("Progman"), NULL );
if( NULL == m_hDesktop_Progman)
{
return;
}
if( NULL != m_hDesktop_Progman )
m_hDesktop_Shelldll_defview = FindWindowEx( m_hDesktop_Progran, NULL, _T("SHELLDLL_DefView"), NULL );
if( NULL != m_hDesktop_Shelldll_defview )
m_hDesktop_Syslistview32 = FindWindowEx( m_hDesktop_Shelldll_defview, NULL, _T("SysListView32"), NULL );
分别得到#32769的窗口指针和其他窗口的句柄。发现:
- SysListView32窗口主要是显示快捷方式等桌面上文件的。如果隐藏这个窗口,那么桌面上显示的那些东西都没有了,但是你会发现鼠标的右键还是可以打开菜单的。如果在隐藏这个窗口之后右键新建一个东西(如文件夹),则也没有显示出来,再把这个窗口Show出来,则这个刚新建文件夹就显示出来了。
- Shelldll_defview窗口在网上的一些说法中认为主要是为了响应一些事件,在这一层可以获得焦点。将Shelldll_defview窗口隐藏后,桌面上的文件也会消失,鼠标在桌面上右击将没有任何效果。其实这样的判断是不准确的。因为可以认为是SysListView32被隐藏,而右击桌面显示的菜单只有在SysListView32窗口中显示,即可以理解为Shelldll_defview隐藏后右击是产生菜单的,而因为SysListView32被隐藏而没有看到。因此为了验证,我就设计了一个功能,将Shelldll_defview窗口缩小(缩小而缩小),在这个窗口的左上角再上一点右击桌面,使预期产生的菜单会覆盖这个窗口,而实际上我发现这个可以产生并显示菜单的窗口没有出现菜单的任何痕迹。同时我发现SysListView32因Shelldll_defview缩小而缩小,SysListView32因Shelldll_defview隐藏而不可见。
- 隐藏Progran,SysListView32和Shelldll_defview也会隐藏,但是如果改变Progman大小,SysListView32和Shelldll_defview大小却不会因此而改变。
- 对#32769窗口隐藏和显示都没有效果。
我将再生成一些窗体,使其父窗口指向桌面的四个窗口。发现如下:
- 新建窗体,使其父窗口为SysListView32。使Syslistview32窗口前置,发现新建窗口仍然完整显示。
- 新建窗体,使其父窗口为Shelldll_defview。使Syslistview32窗口前置,发现新建窗体消失,但是隐藏SysListView32后这个窗体出现,证明SysListView32遮住了这个窗体。
- 新建窗体,使其父窗口为Progman。使Shelldll_defview窗口前置,发现新建窗体消失,但是隐藏Shelldll_defview后这个窗体出现,证明Shelldll_defview遮住了这个窗体。
- 新建窗体,使其父窗口为#32769。使Progman窗口和Shelldll_defview窗口都前置,这个新建的窗体没有发生改变。
以上可以发现SysListView32和Shelldll_defview两个窗体都不是透明的。
- 在1 2 3三个步骤中新建的窗体使用win D是不可以最小化以显示桌面的,而4中新建的窗体可以使用win D最小化以显示桌面。
- 同时4 3 ,开始时只显示4中新建窗口,win D都消失,再win D ,3和4中新建窗口都出现了。同时桌面失去焦点,继续win D就没用了。点击桌面,win D,4中窗口消失,3中保持不变。
- 同时4 2,开始时4中新建窗口显示而2中新建窗口不显示。win D,4中新建窗口消失,2中窗口仍然不显示出来。
- 同时4 1,开始时1和4中新建窗口都显示出来。win D,1和4新建窗口都消失。
这组中可以不考虑4的干扰。因为4的现象一直很稳定。 在以上的探究中,我一直不清楚这四层窗口的摆放顺序。但是如果想新建一个窗口而最少的受桌面操作的影响,就是用2中的方法。
(转载请指明出处)