通过注入绘制到桌面

Drawing to the desktop via injection

本文关键字:桌面 绘制 注入      更新时间:2023-10-16

我想特别用directX 9绘制桌面壁纸区域。在墙纸上方的图标和文字下。类似于Okozo或VLC的模式之一,或Dreamscene。

所以有很多类似的问题,但没有工作示例或教程。这是一个类似的问题,但不同的方法似乎非常有用。几年前,我正在搜索并找到了这个网站和代码。

除了一个大问题之外,即使使用 alpha 混合,图标文本也会变得块状,这是完美的。我尝试了一些修复程序,但我找不到任何有用的文档,也许我只是没有使用正确的词进行搜索,也许它是专有的。我想我通过调用使桌面区域无效来解决这个问题,但我无法真正分辨,因为在此过程中我弄乱了文本的 alpha 值,因此它无法正确绘制字体颜色。那么如何更改文本以进行正确的 alpha 混合呢?

Pouet 的链接都死了我知道我应该发布一个片段,但我无法确定问题出在哪里,因为它更像是一个意想不到的功能。

我一直在寻找这段代码太久了。

我想写一个像应用程序女巫一样的梦境场景,可以渲染视频文件以外的动态内容,这可能是最有希望的解决方案。

我在VS2010 Win7x64中编译了您的代码,发现:


桌面图标文本变得透明,就像 Dreamscene 在窗口时所做的那样:

  • 0x00150138 "项目经理"普罗格曼
    • 0x000605D6 " SHELLDLL_DefView
      • 0x000C05BA "文件夹视图" 系统列表视图32

桌面图标文本变得正常,但当窗口如下所示时不够清晰:

  • 0x000B007C "工人W
    • 0x000605D6 " SHELLDLL_DefView
      • 0x000C05BA "文件夹视图" 系统列表视图32
    • 0x000C05BA "文件夹视图" 系统列表视图32
  • 0x000511E2 "工人W
  • 0x00150138 "项目经理"普罗格曼

我尝试了这种方法在Windows 8中绘制桌面图标后面,以使窗口状态始终像第二个条件;并尝试使用D3D在Progman窗口上方的WorkerW窗口上绘制,但没有任何渲染。

到目前为止,没有任何帮助,转储 memoryDC 使用的位图可能会有所帮助,我将稍后尝试。

如果您有任何进一步的方法,请告诉我。

自从我上次使用英语以来已经很久了,如果有的话,对不起我的错误。

更新:清除图标文本得到!

d3ddev->BeginScene();

d3ddev->SetSamplerState(0,D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
d3ddev->SetSamplerState(0,D3DSAMP_MAGFILTER, D3DTEXF_GAUSSIANQUAD);

而这个:

HWND desktop = GetDesktopWindow();
HWND explorer = FindWindowEx(desktop, 0, _T("Progman"), _T("Program Manager"));
SendMessageTimeout(explorer, 0x052C, 0, 0, SMTO_NORMAL, 3000, NULL);
HWND defView = 0;
HWND worker = 0;
while(!defView) {
    worker = FindWindowEx(desktop, worker, _T("WorkerW"), 0);
    if(worker) {
        defView = FindWindowEx(worker, 0, _T("SHELLDLL_DefView"), 0);
    }
    else break;
}
if (!worker){ /*DBG("First WorkerW failed");*/ return 0;}
worker = FindWindowEx(desktop, (HWND)worker, _T("WorkerW"), 0); //find the next WorkerW
if (!worker){ /*DBG("Created WorkerW not found");*/ return 0;}

仍在列表上绘制视图,但工作线程窗口必须存在。此代码仅在启用 Aero 主题的情况下运行。