Я знаю, что это довольно поздний ответ, но я недавно сам изучил его, и если у других пользователей возникнет такая же проблема, это может им помочь.
ПРИМЕЧАНИЕ. Этот ответ предназначен для C ++, но, возможно, он поможет вам сделать то же самое на C #.
Как упоминалось в комментарии выше, я следовал этому руководству, чтобы понять, как я могу нарисовать ON окно обоев 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;
}
Мне удалось получить дескриптор окна.
Поскольку я был знаком только с SDL, это было единственное решение, которое я нашел, но я считаю, что любые способы, позволяющие создавать / изменять окно на основе другого окна, должны работать.
window = SDL_CreateWindowFrom((void*)get_wallpaper_window());
Строка выше позволила мне создать окно в SDL из HWND, полученного методом get_wallpaper_window()
.
Поскольку задействовано много кода, я свяжу свое решение на github. Это может нарисовать много звезд (хотя я считаю, что это можно улучшить) за вашими значками на рабочем столе.
person
darclander
schedule
31.10.2020