C++ 通过注入将图形绘制到桌面

C++ 通过注入将图形绘制到桌面,c++,winapi,desktop,directx-9,C++,Winapi,Desktop,Directx 9,我特别想用directX 9绘制桌面墙纸区域。在墙纸上方的图标和文本下方。 类似于Okozo或VLC的模式之一,或Dreamscene 所以有很多类似的问题,但没有工作示例或教程。这看起来非常有用。几年前,我在寻找和发现 这是完美的,除了一个大问题,图标文本变得块状,甚至与阿尔法混合。我尝试了一些修复,但找不到任何有用的文档,可能是因为我没有使用正确的词进行搜索,可能是专有的。我想我通过调用使桌面区域无效来修复了这个问题,但是我不能确定,因为在这个过程中,我弄乱了文本的alpha值,所以它不能正

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

所以有很多类似的问题,但没有工作示例或教程。这看起来非常有用。几年前,我在寻找和发现

这是完美的,除了一个大问题,图标文本变得块状,甚至与阿尔法混合。我尝试了一些修复,但找不到任何有用的文档,可能是因为我没有使用正确的词进行搜索,可能是专有的。我想我通过调用使桌面区域无效来修复了这个问题,但是我不能确定,因为在这个过程中,我弄乱了文本的alpha值,所以它不能正确地绘制字体颜色。那么我如何修改文本以进行适当的alpha混合呢

Pouet的链接都死了 我知道我应该发布一个片段,但我无法确定问题出在哪里,因为这更像是一个意外的特性

我已经搜索这个代码太久了。 我想写一个像Dreamscene一样的应用程序witch,它可以呈现动态内容,而不仅仅是视频文件,这可能是最有希望的解决方案

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


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

  • 0x00150138“程序管理器”程序员
    • 0x000605D6“外壳DLL\u DefView
      • 0x000C05BA“FolderView”系统列表视图32

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

  • 0x000B007C“”工件
    • 0x000605D6“外壳DLL\u DefView
      • 0x000C05BA“FolderView”系统列表视图32
    • 0x000C05BA“FolderView”系统列表视图32
  • 0x000511E2“WorkerW
  • 0x00150138“程序管理器”Progman
我尝试了这种方法,使窗口状态始终像第二个条件;并尝试使用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;}

仍在listView上绘制,但工作窗口必须存在。此代码仅在启用了Aero主题的情况下运行。

Stackoverflow是针对特定编程问题的问答网站。“欢迎任何帮助”不是一个关于stackoverflow的好问题。事实上,你的问题根本不是问题。谢谢你的意见。这就是我提到的问题。我只是想解决这个问题这是完美的,除了一个大问题,图标文本变得块状,甚至与阿尔法混合。我尝试了一些修复,但找不到任何有用的文档,可能是因为我没有使用正确的词进行搜索,可能是专有的。我想我通过调用使桌面区域无效来修复了这个问题,但是我不能确定,因为在这个过程中,我弄乱了文本的alpha值,所以它不能正确地绘制字体颜色。那么我该如何改变文本以进行适当的alpha混合呢?我只是在Windows864X上测试了一下,它不是100%正确,因为它可以很好地生成叠加和文本,但是使用了我的树懒背景(它有一些黑线)将鼠标悬停在图标上会显示原始桌面背景,因此可能它不是正确的图层?我没有windows 8 PC,但在windows 7 x64上,如果我左键单击并拖动,它会在矩形中显示部分桌面背景(alpha混合),并将鼠标悬停在图标上。我还尝试了原始的Win7 Dreamscene,发现它也有同样的问题。如果与Dreamscene一起运行此程序,Dreamscene视频将显示在覆盖层之外,如果拖动鼠标,屏幕将在它们之间翻转。所以我认为它几乎是正确的图层。我经常使用Dreamscene,其中一个用黑色1x1像素的jpg文件替换桌面背景。设置黑色背景可能是最终的解决方案。@Rorschach-我在Win7上尝试了你的代码(在Delphi中),但没有绘制。你能解释一下这个原理吗?1.为什么在找到SHELLDLL_DefView后找到下一个worker?2.你在哪里画画?在SHELLDLL_deView、WorkerW、SysListView32上?谢谢@安培1。在向资源管理器调用SendMessage 0x052C后,将创建一个新的WorkerW,并将其称为下一个WorkerW。我们试图找到下一个工人,以确保一切顺利。2.在“FolderView”SysListView32上绘图。