c++ - 通过注入(inject)绘制到桌面

标签 c++ winapi desktop directx-9

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

所以有很多类似的问题,但没有工作示例或教程。这 A simmilar question but different approach似乎很有用。几年前我搜索并找到了 this site and code .

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

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

最佳答案

我已经搜索这段代码太久了。

我想写一个 Dreamscene 之类的应用程序女巫可以呈现动态内容而不仅仅是视频文件,这个可能是最有希望的解决方案。

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


桌面图标文本变得透明,就像 Dreamscene 一样,当窗口是这样的:

  • 0x00150138 “项目经理”Progman
    • 0x000605D6 ""SHELLDLL_DefView
      • 0x000C05BA "文件夹 View "SysListView32

桌面图标文字变得正常但不够清晰时窗口是这样的:

  • 0x000B007C“” worker W
    • 0x000605D6 ""SHELLDLL_DefView
      • 0x000C05BA "文件夹 View "SysListView32
    • 0x000C05BA "文件夹 View "SysListView32
  • 0x000511E2 "" worker W
  • 0x00150138 "项目经理"Progman

我试过这个方法Draw Behind Desktop Icons in Windows 8使窗口状态始终像第二个条件;并尝试使用 D3D 在 Progman 窗口上方的 WorkerW 窗口上绘制,但没有渲染出来。

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

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

好久没用英语了,如有错误请见谅。

更新:Clear Icon Text got!

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 主题 的情况下运行。

关于c++ - 通过注入(inject)绘制到桌面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34952967/

相关文章:

您经常关注的 C++ 博客?

c++ - С++ 中的字符串文字是在静态内存中创建的吗?

c++ - 没有 aero 对话框无法正确显示

c++ - 文件搜索进度条

excel - 如何使用 VBA 判断宏是否正在从电子邮件或桌面运行?

c++ - 创建在新 Windows 桌面上运行 IE 的进程

c++ - Bag Of Words 的标签数据

c++ - 有没有办法改变 std::pair 的引用成员指向的位置?

c++ - Windows 库包含在 CMake 项目中

macos - Mac 上的实时动态壁纸(桌面)