Установите ваше окно как дочернее окно рабочего стола (процесс "Диспетчер программ" или "progman"). Мне удалось использовать этот метод в Windows XP (x86) и Windows Vista (x64).
Я наткнулся на этот метод, когда искал способ заставить экранную заставку отображать как обои. Оказывается, это что-то вроде встроенного в системный обработчик .scr. Вы используете screensaver.scr /p PID
, где PID - это идентификатор процесса другой программы для подключения. Поэтому напишите программу, чтобы найти дескриптор программы, а затем вызовите .scr с этим аргументом / p, и у вас появятся обои с заставкой!
Проект, с которым я сейчас играю, - это отображение состояния рабочего стола (показывает время, некоторые задачи, подключенные диски и т. Д.), И он построен на Strawberry Perl и обычном Win32 APIS (в основном Win32 :: GUI и Win32 :: Модули API), поэтому код легко переносить или понимать любой динамический язык с похожими привязками Win32 API или с доступом к Windows Scripting Host (например, ActivePerl, Python, JScript, VBScript). Вот соответствующая часть класса, которая создает окно:
do { Win32::API->Import(@$_) or die "Win32::API can't import @$_ ($^E)" } for
[user32 => 'HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)'],
[user32 => 'HWND SetParent(HWND hWndChild, HWND hWndNewParent)'],
sub __screen_x {
Win32::GUI::GetSystemMetrics(SM_CXSCREEN)
}
sub __screen_y {
Win32::GUI::GetSystemMetrics(SM_CYSCREEN)
}
sub _create_window { # create window that covers desktop
my $self = shift;
my $wnd = $$self{_wnd} = Win32::GUI::Window->new(
-width => __screen_x(), -left => 0,
-height => __screen_y(), -top => 0,
) or die "can't create window ($^E)";
$wnd->SetWindowLong(GWL_STYLE,
WS_VISIBLE
| WS_POPUP # popup: no caption or border
);
$wnd->SetWindowLong(GWL_EXSTYLE,
WS_EX_NOACTIVATE # noactivate: doesn't activate when clicked
| WS_EX_NOPARENTNOTIFY # noparentnotify: doesn't notify parent window when created or destroyed
| WS_EX_TOOLWINDOW # toolwindow: hide from taskbar
);
SetParent($$wnd{-handle}, # pin window to desktop (bottommost)
(FindWindow('Progman', 'Program Manager') or die "can't find desktop window ($^E)")
) or die "can't pin to desktop ($^E)";
Win32::GUI::DoEvents; # allow sizing and styling to take effect (otherwise DC bitmaps are the wrong size)
}
Эта программа буферизирует вывод, чтобы предотвратить мерцание, что вы, вероятно, захотите сделать также. Я создаю DC (контекст устройства) и PaintDesktop к нему (вы можете использовать любое растровое изображение только с парой строк - CreateCompatibleBitmap, прочитать файл и выбрать дескриптор растрового изображения в качестве кисти), затем создать буфер хранения, чтобы сохранить чистая копия этого фона и рабочий буфер для сборки фрагментов - в каждом цикле копируйте в фоновом режиме, затем рисуйте линии и чистите растровые изображения и используйте TextOut - который затем копируется в исходный DC, после чего он появляется на экран.