DirectX桌面

我想为使用DirectXWindows 7制作animation桌面背景。 我正在使用C#,SlimDX和一些Windows API函数的P / Invoke导入。 我并不擅长使用本机Windows编程,但是我在网上有一个捅,我相信我需要做的是:

1)find包含dekstop壁纸的窗口的句柄,将其挂接到DirectX设备并绘制到其中。

2)制作一个新的输出窗口,并将其插入到桌面壁纸的上方,但在桌面图标的下方。

我已经尝试了这两个,但似乎都没有工作。 如果我从GetDesktopWindow()返回的句柄开始浏览窗口的层次结构,我可以去Desktop – > WorkerW – > SHELLDLL_DefView – > SysListView32。 如果我将DirectX设备连接到此句柄,则可以绘制整个桌面,但也会覆盖这些图标。 如果我创build一个Windows窗体,使用SetParent()将它的父窗体设置为SHELLDLL_DefView,然后使用SetWindowPos来播放它的Z顺序,我似乎只能把它放到桌面壁纸的后面或桌面+图标的前面。

它看起来好像桌面壁纸是包含图标的文件夹视图的背景,因此我正在尝试做的事情无法正常工作。 唯一的解决scheme就是不使用桌面上的图标,或find一些替代scheme,例如覆盖桌面,然后覆盖一个包含某个文件夹内容视图的透明窗口。

有没有人知道我应该做什么,甚至不知道我想做什么是可能的? 看来你可以使用GDI(因为我相信wxSnow程序)可以绘制到桌面背景,而且我已经看到类似于我在Windows XP下使用DirectX壁纸模式所做的VLC媒体播放器的东西(有趣的是,我似乎无法让我的系统上启用此选项)。

谢谢!

Solutions Collecting From Web of "DirectX桌面"

看起来这可能是不可能的。 看到这个链接:

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/69839cec-3424-4300-9ac3-486b8c2fe492

如果您需要在桌面背景和桌面图标之间绘制一些控件,可以采取以下步骤:

  1. 在Windows控件库中创建您的用户控件。
  2. 将用户控件嵌入到ActiveX控件中。
  3. 将ActiveX控件嵌入到网页中。
  4. 启用活动桌面并将网页设置为您的桌面背景。

这只能在XP中完成,因为Vista不支持活动桌面。

另一篇文章表明,如果你能得到构成它的窗口的句柄,你可以用一个资源管理器窗口的背景来做到这一点。 当然,如果可能的话,也可以在图标后面获得桌面窗口的句柄。

更新:到目前为止,我发现可能“工作”的唯一的事情就是创建位图文件和一遍又一遍地改变壁纸(我怀疑这会很慢,正如你所提到的)。

全屏图像必须驻留在内存中,但是如果没有严重的低级内存黑客入侵,可能无法访问它。 我要继续寻找。

更新2:这可能工作,但我不知道:

http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/4af734fb-d2c1-414b-a9f1-759b76692802

它的肉是这样的:

HWND p = FindWindow("ProgMan", NULL); HWND s = FindWindowEx(p, NULL, "SHELLDLL_DefView", NULL); HWND dtw = FindWindowEx(s, NULL, "SysListView32", NULL); HDC hdc = GetDC(dtw); 

你基本上是从ProgMan窗口开始,并从那里钻到桌面壁纸(我猜是“SysListView32”)。 我要去试试这个

更新3:没有去 – 上面的代码确实得到了桌面的DC,但是它在图标之上,所以BitBlt将其绘制。 但是,这并不是画在屏幕上,因为我可以在没有遮盖的情况下画下一个开放的形式,所以至少是进步。

我猜测除了“SysListView32”是图标背后的桌面之外,还有一些可用的窗口,或者有多个“SysListView32”窗口。

更新4:我很确定使用它的东西会工作:

http://msdn.microsoft.com/en-us/library/bb761155(v=VS.85).aspx http://msdn.microsoft.com/en-us/library/bb774742(v=VS.85)的.aspx

基本上,这是一个你调用的API方法,传递一个包含位图句柄的结构。 如果通话成功,则该位图成为桌面。

DirectX是否将帧作为位图句柄(与GDI兼容)来显示,还是只显示DC? 在我的情况下,我的动画已经是一个GDI兼容位图的数组,所以我不会用这种方法的麻烦。 如果这是唯一的路线,DirectX不公开位图句柄(我不认为他们会这样做),那么对于每一个帧,你将不得不创建一个新的GDI位图,这会减慢相当多的事情。

其实,可能有一个更简单的方法,虽然我不知道它会起作用。 一旦获得了壁纸的实际位图的句柄,就可以使用SelectObject将其选择到设备上下文中,然后将该设备上下文用作BitBlt目标。 但是,您可能必须将重新绘制指令发送到桌面,这可能会触发图标每次被重新绘制。

你在这里做些什么工作? 🙂

我想你可以通过动态生成位图每秒获得不少帧,并不断将其设置为桌面背景。 但是,这听起来不必要的(几乎愚蠢)为CPU。 更新 :现在我想到了(写这个的时候已经很晚了),这种方法的主要问题是每次显示一个新的帧时都需要从硬盘读写位图。 这是不可行的。

你真的使用桌面的图标? 在Windows 7中,开始菜单搜索功能和新任务栏使我不使用桌面上的图标。

只是一个想法

可以通过SendMessage(GetDesktopWindow,WM_SOME_MESSAGE,wParam,lParam)来改变桌面窗口,这样就可以实现你想要的。 我可能会明天进一步调查(当地时间上午3点)。

我已经做了一些始终在Z顺序顶部的alpha混合窗口的动画 。 一个想法是忽略试图修改桌面位图,只是把你的东西绘制成一个分层的窗口,但以某种方式管理ZOrder,所以它始终是最底层的非桌面窗口(可能通过战略性地调用Form.SendToBack()或在正确的时间)。

根据你正在尝试做什么,这可能会给你同样的动画桌面的效果。