2012-09-14 29 views
7

後來,我注意到VLC可以直接在桌面上播放視頻。當我在我的學校這樣做時,在Windows XP上,它在圖標下面播放。當我在家裏嘗試時,在Windows 7上,它隱藏了圖標。我不確定它是否是操作系統,或者它是否是VLC的更新,但我有興趣在圖標下面播放它。VLC如何在桌面上播放視頻?

注意到這一點後,我有一個想法來製作各種動畫桌面。沒什麼特別的,只有幾個選擇視頻供我自己使用。我開始的想法是在我自己的窗口中播放視頻(使用mciSendString),然後做每幀的PrintWindow,將其保存到文件中,並將桌面牆紙設置爲文件。自那之後,我失去了特定的代碼,但它並沒有起作用,不用說,它會表現糟糕。

回想起來,我意識到必須有比這更有效的方式,但我不能完全理解那是什麼。

我試着將視頻的父窗口設置爲GetDesktopWindow,以最大限度地減少在播放視頻的任務欄上留下新窗口的效果,但能夠通過單擊aero peek按鈕或擊Win + D。

然後我嘗試了與桌面文件夾視圖窗口的父窗口相同。結果是播放視頻的窗口尺寸相同,但這次無法訪問桌面,也沒有創建新窗口。就好像它在大多數桌面上播放一樣,但小工具在頂部,而右側和底部的區域仍然顯示,因爲較小的播放窗口大小。

VLC如何在桌面上播放它,看起來好像是動態壁紙?讓它在圖標下面播放會非常困難(如果您在Windows 7中添加了小工具,我想)?該程序本身將在Windows XP上使用。我不確定DirectShow是否有任何可能的幫助,但我願意使用它,除了MCI之外的其他Windows API領域。如果它有所作爲,我寧願使用C++解決方案。 .NET也可以很好地工作,但可能需要一些額外的時間。

+0

我認爲你可以有一個網頁作爲Windows XP壁紙,但我不知道它在Windows 7上可用的嘛,這個想法將是一個ActiveX內玩(因爲你用C++標記)控制,但是我相信這是非常有限的。雖然,可能還有其他方法可以更加優雅地實現你想要的東西。 – nullpotent

+0

@iccthedral,如果它起作用,那是某種東西。我沒有使用過ActiveX控件,但是我肯定可以開始。我只會在學校使用它,所以只使用XP並不是問題。 – chris

+0

除非你想自己動手做這個,[這裏是](http://www.dreamsceneseven。com /)在Windows 7上啓用[Windows DreamScene](https://en.wikipedia.org/wiki/Windows_DreamScene)的實用程序。 – Praetorian

回答

7

VLC將壁紙設置爲特定顏色,然後使用DirectDraw更新爲桌面定義的疊加表面中的該顏色鍵。

我從來沒有做過它自己,但這裏有幾個地方尋找更多信息:

+0

我會研究它,謝謝。當我嘗試它時你會聽到。 – chris

+1

它工作得很好,謝謝。只有幾件小事才能工作,我會好起來的:) – chris

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