2012-09-14 15 views
7

Qualche tempo fa ho notato che VLC ha la capacità di riprodurre video direttamente sul desktop. Quando l'ho fatto nella mia scuola, su Windows XP, ha giocato sotto le icone. Quando ho provato a casa, su Windows 7, nascondevo le icone. Non sono sicuro che sia il sistema operativo o se si tratta di un aggiornamento di VLC, ma sono interessato a riprodurlo sotto le icone.In che modo VLC riproduce video sul desktop?

Dopo aver notato questo, ho avuto un'idea di creare un desktop animato di sorta. Niente di speciale, solo alcuni video selezionati per mio uso personale. L'idea che ho iniziato era quella di riprodurre un video nella mia finestra (usando mciSendString) e fare un PrintWindow di ciascun fotogramma, salvarlo in un file e impostare lo sfondo del desktop come file. Da allora ho perso il codice specifico, ma non funzionava, e, inutile dirlo, si comporterebbe in modo orribile.

Tornando ad esso, ho realizzato che ci deve essere un modo molto più efficiente di quello comunque, ma non riesco a capire cosa sia.

Ho provato (tutto in Windows 7 ora) impostando la finestra genitore del video su GetDesktopWindow, con l'effetto di ridurre a icona tutte le finestre lasciando una nuova finestra sulla barra delle applicazioni che riproduce il video, ma riuscendo a visualizzare il desktop facendo clic sul pulsante Aeek Peek o battere Win + D.

Ho quindi provato lo stesso con una finestra padre della finestra di visualizzazione della cartella del desktop. Il risultato era la stessa finestra quotata che riproduceva il video, ma questa volta non è stato possibile accedere al desktop e non è stata creata una nuova finestra. È come se stesse giocando sopra la maggior parte del desktop, ma i gadget vanno al di sopra e le aree verso destra e in basso si mostrano ancora a causa della dimensione della finestra di riproduzione più piccola.

Che cosa fa VLC per riprodurlo sul desktop stesso, con l'aspetto di uno sfondo dinamico? È molto più difficile farlo giocare sotto le icone (e i gadget se aggiungo in Windows 7, suppongo)? Il programma stesso verrà utilizzato su Windows XP. Non sono sicuro che DirectShow abbia qualcosa che possa essere d'aiuto, ma sono disposto a usarlo, tra le altre aree dell'API di Windows oltre a MCI. Preferirei che la soluzione fosse in C++, se fa la differenza. .NET funziona anche bene, ma potrebbe richiedere un po 'di tempo in più.

+0

penso che si può avere una pagina web come una carta da parati su Windows XP, ma non sono sicuro se il suo disponibili su Windows 7. Bene, l'idea sarebbe quella di giocare all'interno di un ActiveX (dal momento che l'hai taggato con C++), ma credo che sia molto restrittivo. Tuttavia, probabilmente ci sono altri modi per ottenere ciò che desideri un po 'più elegantemente. – nullpotent

+0

@iccthedral, se funziona, è qualcosa. Non ho usato i controlli ActiveX, ma posso sicuramente iniziare. Lo userò solo a scuola, quindi lavorare su XP non è un problema lì. – chris

+0

A meno che tu non voglia farlo tu stesso per divertimento, [ecco] (http: //www.dreamsceneseven.it /) un'utilità che abilita [Windows DreamScene] (https://en.wikipedia.org/wiki/Windows_DreamScene) su Windows 7. – Praetorian

risposta

7

VLC imposta lo sfondo su un colore specifico, quindi utilizza DirectDraw per aggiornare quella chiave di colore all'interno di una superficie di sovrapposizione definita per il desktop.

ho mai fatto io stesso, ma qui ci sono un paio di posti per cercare ulteriori informazioni:

+0

Lo guarderò, grazie. Sentirai indietro quando lo provo. – chris

+1

Funziona molto bene, grazie. Ci sono solo un paio di piccole cose per lavorare e starò bene :) – chris

3

Si può solo prendere del desktop gestire e disegnare i propri componenti o dati

provare questo,

#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 
Problemi correlati