8

しばらく前に、VLCにはデスクトップで直接ビデオを再生する機能があることに気づきました。私が学校でそうしたとき、Windows XPでは、アイコンの下で再生されました。自宅で試してみると、Windows7ではアイコンが隠れていました。それがオペレーティングシステムなのか、それともVLCのアップデートなのかはわかりませんが、アイコンの下で再生することに興味があります。

これに気づいた後、私はある種のアニメーションデスクトップを作ることを思いついた。特別なことは何もありません。私が使用するためのいくつかの選択したビデオだけです。mciSendString私が始めたアイデアは、(を使用して)自分のウィンドウでビデオを再生し、PrintWindow各フレームを実行してファイルに保存し、デスクトップの壁紙をファイルとして設定することでした。それ以来、特定のコードを失いましたが、それは完全には機能していませんでした。言うまでもなく、ひどいパフォーマンスになります。

振り返ってみると、とにかくそれよりもはるかに効率的な方法があるはずだと気づきましたが、それが何であるかを完全に理解することはできません。

ビデオの親ウィンドウをに設定してみました(すべてWindows 7で)GetDesktopWindow。これにより、すべてのウィンドウが最小化され、ビデオを再生するタスクバーに新しいウィンドウが残りますが、エアロピークボタンをクリックするか、を押すとデスクトップが表示されます。 Win+D。

次に、デスクトップのフォルダビューウィンドウの親ウィンドウで同じことを試しました。結果は、ビデオを再生する同じサイズのウィンドウでしたが、今回はデスクトップにアクセスできず、新しいウィンドウは作成されませんでした。ほとんどのデスクトップの上で再生していたようですが、再生ウィンドウのサイズが小さいため、ガジェットが上に移動し、左右の領域が表示されたままになります。

ダイナミックな壁紙のように見えるように、VLCはデスクトップ自体でそれを再生するために何をしますか?アイコン(およびWindows 7で追加した場合はガジェット)の下で再生するのは非常に難しいですか?プログラム自体はWindowsXPで使用されます。DirectShowに役立つものがあるかどうかはわかりませんが、MCIだけでなく他のWindowsAPI領域の中でも特に使用したいと思います。違いが出るのであれば、ソリューションはC++である方がいいと思います。.NETもうまく機能しますが、での作業には少し余分な時間がかかる場合があります。

4

2 に答える 2

7

VLC は壁紙を特定の色に設定し、DirectDraw を使用して、デスクトップ用に定義されたオーバーレイ サーフェス内のそのカラー キーを更新します。

私は自分で行ったことはありませんが、詳細については次の場所を参照してください。

于 2012-09-14T03:15:08.930 に答える
2

デスクトップハンドルを取得して、独自のコンポーネントまたはデータを描画できます

これを試して、

#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
于 2014-07-22T20:54:26.417 に答える