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 ^^ !
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.