- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想使用 DirectX 为 Windows 7 制作动画桌面背景。我正在使用 C#、SlimDX 和几个 Windows API 函数的 P/Invoke 导入。我对 native Windows 编程并不擅长,但我在网上浏览了一下,我认为我需要做的是:
1) 找到包含桌面墙纸的窗口句柄,将其连接到 DirectX 设备并在其中绘制。
2) 制作一个新的输出窗口,并将其插入桌面墙纸上方但桌面图标下方。
这两种我都试过了,但似乎都不起作用。如果我从 GetDesktopWindow() 返回的句柄开始导航窗口层次结构,我可以转到桌面 -> WorkerW -> SHELLDLL_DefView -> SysListView32。如果我将 DirectX 设备连接到这个 handle ,我可以在整个桌面上绘制,但它也会覆盖图标。如果我创建一个 Windows 窗体,使用 SetParent() 将其父级设置为 SHELLDLL_DefView,然后使用 SetWindowPos 来玩它的 Z 顺序,我似乎只能让它在桌面墙纸后面或桌面 + 图标前面。
看起来好像桌面墙纸是包含图标的文件夹 View 的背景,因此我尝试做的事情不起作用。唯一的解决方案就是不使用桌面图标,或者寻找一些替代方案,例如覆盖桌面,然后覆盖一个包含某个文件夹内容 View 的透明窗口。
有没有人知道我应该做什么,或者我想做的事情是否可行?看起来你可以使用 GDI 绘制到桌面背景(我相信 wxSnow 程序就是这样做的),而且我已经看到了类似于我想要在 Windows XP 下使用 DirectX 壁纸模式的 VLC Media Player 所做的事情(有趣的是,我似乎无法在我的系统上启用此选项)。
Cảm ơn!
câu trả lời hay nhất
看起来这可能是不可能的。请参阅此链接:
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/69839cec-3424-4300-9ac3-486b8c2fe492
If you need to draw some controls between the desktop background and desktop icons, an alternative step is below:
- Create your user control in a windows control library.
- Embed the user control in an ActiveX control.
- Embed the ActiveX control in a web page.
- Enable active desktop and set the web page to be your desktop background.
This can only be done in XP since Vista doesn’t support active desktop.
那里的另一篇文章建议您可以在资源管理器窗口的背景下执行此操作 - 如果您可以获得构成它的窗口的句柄。当然,如果可能的话,也有可能获得图标后面的桌面窗口句柄。
gia hạn:到目前为止,我发现唯一可能“有效”的方法就是创建位图文件并一遍又一遍地更改墙纸(我怀疑这会很慢,正如你提到的)。
该全屏图像必须驻留在内存中的某个地方,但如果不进行一些严重的低级内存黑客攻击,则可能无法访问它。我会继续寻找。
Cập nhật 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 目标。不过,您可能必须向桌面发送重绘指令,这可能会触发图标每次都重绘。
你在这里做点工作怎么样? :)
关于c# - DirectX 桌面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619331/
我想用groupshared DirectX 计算着色器中的内存以减少全局内存带宽并有望提高性能。我的输入数据是 Texture2D我可以像这样使用二维索引来访问它: Input[threadID.x
我一直在查看 MSDN 和 Microsoft.com,但只能找到存档论坛。现在还有 Microsoft Run DirectX 论坛吗? 最佳答案 在这里: http://forums.xna.co
我正在尝试将网格切成两半,或者至少能够实时删除其中的面。我想知道如何去做这件事? 锁定顶点缓冲区,将选定的面或顶点 memset 为 0,对我不起作用。有没有人对此有解决方案或教程,我真的希望在我的程
我想这是一个相当深入的主题,因此任何带有洞察信息的网址也很乐意接受。我一直在使用原生 DirectX,但从未管理过。另一方面,大多数情况下,在开发不需要高级 GPU 渲染的其他类型的应用程序时,我通常
微软的开源DirectX Shader Compiler描述了一种用于 HLSL 着色器的新中间语言 (IL) 的格式,称为 DXIL。 文档引用了从以前的 HLSL IL(称为 DXBC)到新 DX
我需要同时在更大的显示器上全屏显示在我的应用程序中播放的视频。在某些显卡上,这称为影院模式,使用显卡制造商提供的工具进行配置。 我只想用软件来做到这一点。我可以用 DirectX 做到这一点吗? 我的
我问 how to take the screen shot in DirectX并回答了“使用 GetFrontBufferData()”。然而,“这个函数在设计上非常慢,并且不应该在任何性能关键路
这让我感到困惑。 DirectX 绕过所有内容并直接与设备驱动程序对话,因此 GDI 和其他常用方法将不起作用 - 除非 Aero 被禁用(或不可用),否则出现的只是屏幕左上角的黑色矩形。我已经尝试了
我们正在开发一个通过 Direct3D 可视化显示信息的应用程序。迟到的客户端请求是能够通过某些远程桌面解决方案查看此应用程序。 有人做过类似的事情吗?哪些选项可用/不可用?我正在考虑 RDC、VNC
由于D3DPOOL_SCRATCH处理速度较慢,所以我编写了桌面捕获程序以引用网上的报告。然而,结果却是一片漆黑的画面。这是控制台程序的结果还是有其他原因? #include #include #
背景 我正在玩东方系列游戏之一的不朽之夜。射击按钮是“z”,移动较慢是“shift”,方向键移动。对我来说不幸的是,使用 shift-z 重影我的右箭头键,所以我在射击时无法向右移动。这种重影发生在所
我已经阅读了关于 DirectX 光栅化规则的在线文档,但我仍然不明白为什么这段代码没有在屏幕上产生任何可见的东西? target->SetAntialiasMode(D2D1_ANTIALIAS_M
如您所知,当我们想要在 DirectX 中绘制三维对象时,我们应该定义相机。现在我们有一个设备对象,它的名称是“device1”。这是我的问题: device1.View = Matrix.Look.
我正在使用桌面复制 API 从一个 GPU 捕获桌面,并且需要将纹理(位于 GPU 内存中)复制到另一个 GPU。为此,我有一个捕获线程,用于获取桌面图像,然后使用 ID3D11DeviceConte
假设 DX12 被挂接到叠加渲染的场景,看起来挂接的最佳函数是 IDXGISwapChain::Present,与 DX11 的方式相同。将此函数 Hook 后,交换链就可用,并且可以从中检索设备以创
当帧开始时,我会进行逻辑更新并在此之后进行渲染。 在我的渲染代码中,我做通常的事情。我设置了一些状态、缓冲区、纹理,并通过调用 Draw 来结束。 m_deviceContext->Draw(
我使用 DirectX 9.0 制作了一个小型 3D 查看器应用程序。现在我想添加一些编辑功能。假设我想编辑一个大多边形。当用户编辑形状时,顶点将被添加、删除和移动。现在每个多边形都存储为顶点缓冲区。
我编写了一个应用程序,它可以在 OpenGL、DirectX 9 和 DirectX 11 之间切换以进行渲染,而无需重新启动或重新创建窗口。在 OpenGL 和 DirectX 9 以及 Direc
如何在 DirectX 中执行此操作? glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); 不知何故,我似乎无
msdn documentation解释了在 directx 11 中,有多种方法可以通过编程方式填充 directx 11 纹理: (1) 使用默认使用纹理创建纹理并使用内存中的数据对其进行初始化
Tôi là một lập trình viên xuất sắc, rất giỏi!