Как VLC воспроизводит видео на рабочем столе?

Некоторое время назад я заметил, что VLC имеет возможность воспроизводить видео прямо на рабочем столе. Когда я делал это в моей школе, на Windows XP, он играл под иконками. Когда я попробовал дома, на Windows 7 он спрятал иконки. Я не уверен, что это операционная система или обновление VLC, но мне интересно играть в нее под иконками.

Заметив это, у меня появилась идея сделать своего рода анимированный рабочий стол. Ничего особенного, только несколько избранных видео для моего собственного использования. Идея, с которой я начал, состояла в том, чтобы воспроизвести видео в моем собственном окне (используя mciSendString) и сделать PrintWindow каждого кадра, сохраните его в файл и установите обои для рабочего стола в качестве файла. С тех пор я потерял конкретный код, но он не работал, и, разумеется, работал бы ужасно.

Возвращаясь к этому, я понял, что должен быть гораздо более эффективный способ, чем этот, но я не могу понять, что это такое.

Я попытался (все в Windows 7 сейчас) установить родительское окно видео в GetDesktopWindow, чтобы минимизировать все окна, оставляя после себя новое окно на панели задач, воспроизводящее видео, но имея возможность видеть рабочий стол, нажимая кнопку aero peek или нажимая Win + D.

Затем я попробовал то же самое с родительским окном окна просмотра папок на рабочем столе. В результате было воспроизведено видео того же размера, но на этот раз доступ к рабочему столу невозможен, и новое окно не было создано. Это похоже на то, как будто играли поверх большей части рабочего стола, но гаджеты идут сверху, а области справа и снизу все еще отображаются из-за меньшего размера игрового окна.

Что делает VLC, чтобы воспроизводить его на рабочем столе, как будто это динамические обои? Значительно ли сложнее заставить его играть под иконками (и гаджетами, если вы добавите в Windows 7, я полагаю)? Сама программа будет использоваться в Windows XP. Я не уверен, есть ли в DirectShow что-нибудь, что могло бы помочь, но я готов использовать это, помимо других областей API Windows, кроме MCI. Я бы предпочел, чтобы решение было на C ++, если оно имеет значение. .NET также будет работать хорошо, но может занять немного больше времени, работая.

7

Решение

VLC устанавливает обои для определенного цвета, а затем использует DirectDraw, чтобы обновить этот цветовой ключ в пределах поверхности наложения, определенной для рабочего стола.

Я никогда не делал это сам, но вот несколько мест, где можно найти дополнительную информацию:

7

Другие решения

Вы можете просто взять дескриптор рабочего стола и нарисовать свои собственные компоненты или данные

попробуй это,

#include <stdafx.h>
#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")

VOID OnPaint(HDC hdc)
{
Graphics graphics(hdc);
Pen      pen(Color(255, 0, 0, 255));
graphics.DrawLine(&pen, 0, 0, 200, 100);
}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
HWND                hWnd;
MSG                 msg;
WNDCLASS            wndClass;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR           gdiplusToken;

// Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

wndClass.style          = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc    = WndProc;
wndClass.cbClsExtra     = 0;
wndClass.cbWndExtra     = 0;
wndClass.hInstance      = hInstance;
wndClass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
wndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
wndClass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName   = NULL;
wndClass.lpszClassName  = TEXT("GettingStarted");

RegisterClass(&wndClass);

hWnd = GetDesktopWindow();

ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);

while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

GdiplusShutdown(gdiplusToken);
return msg.wParam;
}  // WinMain

LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
HDC          hdc;
PAINTSTRUCT  ps;

switch(message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
OnPaint(hdc);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
} // WndProc
3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector