Shelltunning : vidéo à la place du fond d'écran

Description

Bonjour à tous !

Toujours dans ma quête de m'amuser avec le shell :) j'ai cette fois imaginé une vidéo en fond d'écran à la place de l'habituel wallpaper statique.
Ceci va permettre de rendre un peu plus vivant l'os et par la même occasion consommer du CPU !

Qu'à cela ne tienne, c'est parti !

Que sait-on sur le shell ?


Active Desktop permet d'afficher une page web en fond d'écran, il va donc falloir jouer avec.
La page web sera un player Windows Media étalé sur 100% de la longueur/largeur de la page, avec des marges nulles.

Pour information, ActiveDesktop permet d'afficher plusieurs items sur le bureau, ainsi on peut se retrouver avec 15 pages web flottantes...(vous pouvez également le tester en vous baladant dans le panneau d'affichage).

1-Objet Active Desktop


Nous entrons direct dans les entrailles du Shell avec la technologie COM de Microsoft, qui a fait le bonheur des programmeurs VB.

Pour faire simple et vite, il faut créer une instance d'objet IActiveDesktop. Après quoi nous aurons accès à l'ensemble des fonctionnalités d'ActiveDesktop qui je vous le rassure sont peu nombreuses.
Pour créer l'instance, on utilisera CoCreateInstance, qui nous allouera un objet de type IActiveDesktop, ce qui nous permettra d'accéder aux méthodes de la classe :).

Analogie :

En C++ :
---------------------------
IActiveDesktop * toto;
toto = new IActiveDesktop;
toto->Coucou();
delete toto;

En COM
---------------------------
IActiveDesktop * toto;

HRESULT hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
IID_IActiveDesktop, (void**)&toto);
toto->Coucou();
toto->Release();

//Note : Ca a l'air compliqué, mais ça ne l'ai pas :oP,
//CLSID_ActiveDesktop n'est autre que le CLSID (identifiant unique) de l'objet COM.
//Pour les newbies, faites un tour dans la base de registre HKCR/CLSID/ -> répertorie TOUS les objets COM

IMPORTANT: Qui dit COM dit appel des fonction CoInitialize en début de projet et CoUninitialize en fin de projet ! C'est impératif !

2-Utilisation d'ActiveDesktop


Les méthodes dont nous aurons besoin sont :

- Set/GetDesktopItemOptions : Activer/Récupérer l'état d'ActiveDesktop
- Add/GetDesktopItem : Ajouter/Modifier un Item ActiveDesktop (entendez par là la fenêtre ou il y aura une page web)
- ApplyChanges : Mise à jour des modifications demandées par les autres fonctions de IActiveDesktop -> appel impératif

Je vous invite à regarder le source ci-dessous, j'ai commenté le remplissage de structure ^^.

L'invité surprise est IActiveDesktopP qui va permettre, via la fonction SetSafeMode, de verrouiller les items.

3-Touche finale


Malgré pas mal d'efforts, je n'ai pas réussi à manipuler la fenêtre ListView des raccourcis du bureau :'( (voir http://www.cppfrance.com/code.aspx?ID=31719).
Malgré tout je vous propose de changer la couleur du fond d'écran du bureau afin que ça ne gâche pas trop l'effet désiré (effet de transparence).
Par chance ma vidéo choisie est plutôt à tendance noir ^^ !
L'API à utiliser est SetSysColors et le paramètre à changer est COLOR_BACKGROUND;

4-Conclusion


Ca a beau n'être qu'un gadget complètement inutile, vous rendrez fou de jalousie vos collègues en mettant une vidéo de l'aquarium 2000 ;). Je déconseille les vidéos "rapide", ou psychédéliques pour les épileptiques !
Il est bien entendu possible de changer index.html et de mettre une animation flash pourquoi pas, voir une vraie page HTML !
Bon amusement, et étonnez vos proches avec votre bureau vivant ;o)

5-Désinstallation


Pour enlever tout ce bazar, allez dans :
Propriété d'affichage->Bureau->Personnalisation
et supprimez (ou décochez ^^ ?) la barre "Poppyto Vidéo Desktop"

Source / Exemple :


/**************************************

  • Vidéo Desktop : alive desktop !!
* * #include <windows.h> #include <wininet.h> // Pour/For IActiveDesktop #include <shlobj.h> // Pour/For IActiveDesktop int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { //Initialise COM //Initialize COM CoInitialize(0); HRESULT hr; IActiveDesktop *pActiveDesktop; // Créé une instance de IActiveDesktop, équivalent de l'operateur new // Create an instance of IActiveDesktop, similar to the new operator hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**)&pActiveDesktop); // Bien remplir la taille de la structure de components ! // Don't forget to set dwSize ! COMPONENTSOPT cmps; cmps.dwSize = sizeof(cmps); // Récupère l'état d'ActiveDesktop // Get the ActiveDesktop State pActiveDesktop->GetDesktopItemOptions(&cmps,NULL); // Est-ce que ActiveDesktop est désactivé ? // Is ActiveDesktop not running ? if(cmps.fActiveDesktop != TRUE || cmps.fEnableComponents != TRUE) { cmps.fActiveDesktop = TRUE; cmps.fEnableComponents = TRUE; //Active ActiveDesktop //Activate ActiveDesktop hr = pActiveDesktop->SetDesktopItemOptions(&cmps,NULL); // Valide la mise à jour -> ActiveDessktop en marche // Validate the update -> ActiveDessktop running hr = pActiveDesktop->ApplyChanges(AD_APPLY_ALL); } //Ajoutons un item à ActiveDesktop //Add an item to à ActiveDesktop COMPONENT comp; memset(&comp,0,sizeof(comp)); comp.dwSize = sizeof(comp); //iComponentType : Type de contrôle, peut être une page web, un ActiveX etc. //iComponentType : Control type, it could be a webpage, an ActiveX etc. comp.iComponentType = COMP_TYPE_WEBSITE;//COMP_TYPE_CONTROL; comp.fChecked = TRUE; comp.fDirty = FALSE; // Pas de barre de défilement // No Scrolling bar. comp.fNoScroll = TRUE; // Item en plein écran // Fullscreen Item comp.dwCurItemState = IS_FULLSCREEN; //Nom de l'item //Item name wcscpy(comp.wszFriendlyName,L"Poppyto Vidéo Desktop"); char PathA[MAX_PATH+1]; wchar_t PathW[MAX_PATH+1]; memset(PathA,0,sizeof(PathA)); memset(PathW,0,sizeof(PathW)); //Construis l'URL de la page web //Build the URL webPage ::GetCurrentDirectory(MAX_PATH,PathA); strcat(PathA,"\\index.html"); //Conversion de la chaine en MultiByte pour COM //Convert string in Multibyte for COM MultiByteToWideChar(CP_ACP, 0, PathA, (int)strlen(PathA)+1, PathW, sizeof(PathW)); //URL de la page web à afficher -> "Répertoire Courant\index.html" //URL of the web page which must be shown -> "Current Directory\index.html" wcscpy(comp.wszSource,PathW); //Réglage de la fenêtre en mode cadre (plus de fullscreen) //Set the position of the window when it is not in fullscreen COMPPOS comppos; comppos.dwSize = sizeof(COMPPOS); comppos.dwWidth = 640; comppos.dwHeight = 480; comppos.fCanResize = FALSE; comppos.fCanResizeX = FALSE; comppos.fCanResizeY = FALSE; comppos.iLeft = 0;//100; comppos.iTop = 0;//20; comppos.izIndex = 0; comp.cpPos = comppos; //Ajout de l'item //Add the item hr = pActiveDesktop->AddDesktopItem(&comp,NULL); //E_FAIL est retourné quand l'item existe déjà //E_FAIL is returned when the item already exists if(hr == E_FAIL) { //Mise à jour de l'item car ile existe déjà (donc on ne peut pas le recréer au dessus) //Update the item because it already exists (so we can't recreate it above) hr = pActiveDesktop->ModifyDesktopItem(&comp,COMP_ELEM_ALL); } // Valide la mise à jour -> L'item est inséré // Validate the update -> The item is inserted hr = pActiveDesktop->ApplyChanges(AD_APPLY_ALL); // Libération : equivalent à l'operateur delete // Release : similar to the delete operator pActiveDesktop->Release(); //Verouille les items pour le redeimensionment //Lock items for resizing IActiveDesktopP *pActiveDesktopP; hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktopP, (void**)&pActiveDesktopP); pActiveDesktopP->SetSafeMode(SSM_SET); pActiveDesktopP->Release(); //Change la couleur de plan arrière de la ListView du Bureau //Change Desktop/ListView item background int Elements = COLOR_BACKGROUND; COLORREF color = RGB(0,0,0); SetSysColors(1,&Elements, &color); //DésInitialise COM //UnInitialize COM CoUninitialize(); return 0; }

Conclusion :


Je n'ai fais presque aucune gestion des erreurs afin de ne pas alourdir le code utile, donc soyez cléments ^^ !

Codes Sources

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.