我正在尝试制作一个需要在桌面上绘制的应用程序,位于图标后面,因此它看起来可以替换桌面墙纸。我找到了一些解决方案,但大多数都没有很好地工作(很多闪烁)。一种解决方案似乎是我正在寻找的,但我真的不明白。我主要使用高级图形库或仅使用 Windows 窗体和一些 C++ 但仅在非 Windows 平台上完成了 C# 应用程序。
如果有人可以为我“翻译”它或为我提供替代解决方案,将不胜感激!
我从来没有找到我想要的解决方案,但这里是最好的(唯一的?)替代方案:
我知道这是一个很晚的答案,但我最近自己调查了一下,如果其他用户有同样的问题,这可能会对他们有所帮助。
注意:此答案适用于 C++,但也许它可以帮助您在 C# 中做同样的事情
正如上面评论中提到的,我按照本指南了解如何在windows壁纸窗口上绘图。
通过使用这两种方法:
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
HWND p = FindWindowEx(hwnd, NULL, "SHELLDLL_DefView", NULL);
HWND* ret = (HWND*)lParam;
if (p)
{
// Gets the WorkerW Window after the current one.
*ret = FindWindowEx(NULL, hwnd, "WorkerW", NULL);
}
return true;
}
HWND get_wallpaper_window() {
// Fetch the Progman window
HWND progman = FindWindow("ProgMan", NULL);
// Send 0x052C to Progman. This message directs Progman to spawn a
// WorkerW behind the desktop icons. If it is already there, nothing
// happens.
SendMessageTimeout(progman, 0x052C, 0, 0, SMTO_NORMAL, 1000, nullptr);
// We enumerate all Windows, until we find one, that has the SHELLDLL_DefView
// as a child.
// If we found that window, we take its next sibling and assign it to workerw.
HWND wallpaper_hwnd = nullptr;
EnumWindows(EnumWindowsProc, (LPARAM)&wallpaper_hwnd);
// Return the handle you're looking for.
return wallpaper_hwnd;
}
我能够检索 Windows 句柄。
由于我只熟悉 SDL,这是我找到的唯一解决方案,但我相信任何允许您基于另一个窗口创建/修改窗口的方法都应该有效。
window = SDL_CreateWindowFrom((void*)get_wallpaper_window());
上面的行允许我从该get_wallpaper_window()
方法检索到的 HWND 在 SDL 中创建一个窗口。
Since there is a lot of code involved I will link my solution on github. This can draw a lot of stars (although I believe it can be improved) behind your desktop icons.
您可以在 VLC 媒体播放器代码中找到灵感。有一种墙纸模式可以满足您的需求。
顺便看到了这个问题,我确实部分解决了这个问题(但我不能提供任何有用的代码)来制作一些很酷的游戏,尽管可能没有你想要的应用程序:
现在在您的表格上按顺序绘制以下内容:
这是我为全屏形式所做的,但我认为可以很容易地适应非全屏形式。从本质上讲,您已经重新创建了桌面,但能够用它做任何事情,包括一些很酷的游戏。任何应用程序的绘制速度和性能都令人满意,但桌面交互性是一个问题...... :( 这是使用该原理的坦克游戏图片,除了我将背景设置为白色并使所有白色背景也透明!
是的,使用互操作,请参阅此线程。