前段时间,我注意到VLC能够直接在桌面上播放视频。当我在学校这样做时,在Windows XP上,它在图标下方播放。当我在家里尝试时,在Windows 7上,它隐藏了图标。我不确定它是操作系统还是VLC的更新,但我有兴趣在图标下面播放它。
注意到这一点之后,我有一个想法制作各种动画桌面。没有什么特别的,只有几个选择视频供我自己使用。我开始的想法是在我自己的窗口中播放视频(使用mciSendString
)并对每个帧执行PrintWindow
,将其保存到文件中,并将桌面壁纸设置为文件。我已经失去了特定的代码,但它不是很有用,而且,不用说,它会表现得非常糟糕。
回过头来,我意识到必须有一种比这更有效的方式,但我无法理解那是什么。
我尝试过(现在全都在Windows 7中)将视频的父窗口设置为GetDesktopWindow
,以最大限度地减少播放视频的任务栏上留下新窗口的所有窗口,但能够看到桌面通过单击aero peek按钮或按下Win + D.
然后我尝试使用桌面文件夹视图窗口的父窗口。结果是播放视频的相同尺寸的窗口,但这次无法访问桌面,也没有创建新窗口。这就像是在桌面的大部分桌面上播放,但是由于播放窗口尺寸较小,小工具超过顶部,右侧和底部区域仍然显示。
VLC在桌面本身上做什么,看起来好像是动态壁纸?是不是很难让它在图标下面播放(如果你在Windows 7中添加小工具,我想)?该程序本身将在Windows XP上使用。我不确定DirectShow是否有任何可能有用的东西,但我愿意使用它,除了MCI之外的其他Windows API领域。如果它有所作为,我宁愿使用C ++解决方案。 .NET也可以运行良好,但可能需要一些额外的时间。
答案 0 :(得分:7)
VLC将壁纸设置为特定颜色,然后使用DirectDraw更新为桌面定义的覆盖表面内的颜色键。
我自己从未这样做过,但这里有一些地方可以找到更多信息:
答案 1 :(得分:3)
您可以使用桌面处理并绘制自己的组件或数据
试试这个,
#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