这下我就懵了,怎么这也不行,那也不行呢?
实际上这里是有一个套路的,而这个套路着实让我琢磨了很久很久!
什么套路呢,咱们往下看!
我查阅了网上大量的资料,在不断的实验中我发现除了拥有子窗口的 WorkerW 之外,其他所有的 WorkerW 都是隐藏不可见的。
而实际有效的做法是,我们需要将程序窗口嵌入到第二个可见非隐藏的 WorkerW 之上才行。
注意它的特点有两个,第一是排名第二并不含有子窗口,第二是可见非隐藏属性。
让 WorkerW窗口可见并且变透明前面我们说过,按下 Win Tab 键可以切换多桌面,当我们这么一切换时,系统就会产生多个 WorkerW 窗口用于过渡切换效果。
所以我们可以用程序模拟按下 Win Tab 键。
不过我尝试模拟按键后,发现有窗口闪动的现象,不是太理想的状态,于是我找到了网上的资料。
根据网上资料,Windows 有一个系统保留消息,当我们向 Progman 窗口发送 0x052C 消息时,桌面就会生成一个透明的 WorkerW 窗口,同时会将 Progman 的子窗口转移到这个新生成的 WorkerW 之下。
这也正是我们前面所看到的,子窗口被“抢过去”的效果。
需要注意的是,这是在 Vista 之后的版本才有效,嗯,可以理解为开启 Aero 效果的系统。
我用 VB 代码很容易就实现了,就像下面这样。
' 获取 Progman 句柄
lngDesktopHwnd = FindWindow("Progman", vbNullString)
' 然后向 Progman 发送 0x052C 使其产生 WorkerW
SendMessage lngDesktopHwnd, &H52C, 0, 0
遍历查找目标 WorkerW窗口
生成了我们想要的 WorkerW 窗口后,我们就要想办法去找到那个目标窗口,也就是第二个可见的 WorkerW 窗口。
切记,这个 WokerW 窗口是可见非隐藏的,并且同时不包含任何子窗口的。
我的遍历算法能用但灰常粗糙,你们简单参考,自己改进哈。
' 获取桌面句柄
lngDesktopHwnd = GetDesktopWindow
' 获得第一个 WorkerW 窗口句柄
lngWorkerW = FindWindowEx(lngDesktopHwnd, 0, "WorkerW", vbNullString)
' 定义临时类名,用于对比查找多个同级的 WorkerW 窗口
Dim lpClassName As String
' 遍历所有 WorkerW 直至找到不拥有 SysListView32 子窗口的那个 WorkerW 为止!
Do While lngWorkerW > 0
If IsWindowVisible(lngWorkerW) Then
lngShellDll = FindWindowEx(lngWorkerW, 0, "SHELLDLL_DefView", vbNullString)
If lngShellDll = 0 Then
Exit Do
Else
' 查找下一个同级的类窗体句柄
lpClassName = Space(255)
Do While UCase(Left(lpClassName, 7)) <> UCase("WorkerW")
lngWorkerW = GetWindow(lngWorkerW, GW_HWNDNEXT)
GetClassName lngWorkerW, lpClassName, 255
Loop
End If
Else
' 查找下一个同级的类窗体句柄
lpClassName = Space(255)
Do While UCase(Left(lpClassName, 7)) <> UCase("WorkerW")
lngWorkerW = GetWindow(lngWorkerW, GW_HWNDNEXT)
GetClassName lngWorkerW, lpClassName, 255
Loop
End If
Loop
将程序窗口变成目标 WorkerW窗口的子窗口
看到没,就像下图这样,我们的程序窗口跑到了第二个可见 WorkerW 的下面了。
参考代码如下:
' 将程序窗口设定为 WorkerW 的子窗口,WorkerW 成为父窗口
lngOriginalParentHwnd = SetParent(Me.hwnd, lngWorkerW)
' 最后在程序退出时别忘记再变回来
lngTmpHwnd = SetParent(Me.hwnd, lngOriginalParentHwnd)
最后,我们看到了这样的效果,窗口终于跑到了图标的后面,耶!
效果演示后续还有很多工作需要继续,比如播放器的操作控制,前景布局等等。
不过这些繁杂的事不算主要问题,我们只要基本能够实现桌面动态播放视频即可。
就像下面,效果还算可以吧。
点击浏览,选择视频文件。