FAQ C++ BuilderConsultez toutes les FAQ
Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010 Ajouter une question
Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez
Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.
L'équipe C++ Builder de Developpez.
Commentez cette FAQ : Commentez
- Comment ajouter une entrée aux Documents récemment ouverts de Windows ?
- Comment masquer les icônes du bureau ?
- Comment fermer une session Windows ?
- Comment mettre en veille l'ordinateur ?
- Comment redémarrer l'ordinateur ?
- Comment éteindre l'ordinateur ?
- Comment obtenir la version de Windows ?
- Comment obtenir le nom de la machine ?
- Comment obtenir le login de l'utilisateur connecté ?
- Comment paramétrer l'affichage de la barre des tâches ?
- Comment tester si un compte est administrateur ?
- Comment modifier le papier peint du bureau ?
Pour ajouter une entrée, il vous faut utiliser la fonction SHAddToRecentDocs (shlobj.h) et l'appeler comme suit :
Code c++ : | Sélectionner tout |
1 2 | AnsiString fichier = "C:\\monFichier.txt"; SHAddToRecentDocs(SHARD_PATH, fichier); |
shobjidl :
- Commenter les lignes 2189 à 2193
- Commenter les lignes 8085 à 8095
shlobj.h :
- Modifier la ligne 1422 en } *LPFVSHOWINFO;
- Modifier la ligne 3457 en } *LPSHELLFLAGSTATE;
Sous Windows, le bureau est représenté par une fenêtre, qui a pour enfant toutes les autres fenêtres. Il faut donc récupérer le Handle de cette fenêtre, ce qui se fait avec la fonction FindWindow.
La fonction ShowWindow permet elle d'agir sur une fenêtre (cacher, afficher, réduire, agrandir, ...).
Code c++ : | Sélectionner tout |
1 2 | HWND Bureau = FindWindow("Progman", "Program Manager"); ShowWindow(Bureau, SW_HIDE); |
Code c++ : | Sélectionner tout |
1 2 | HWND Bureau = FindWindow("Progman", "Program Manager"); ShowWindow(Bureau, SW_SHOW); |
Pour fermer une session Windows, il faut faire appel à la fonction ExitWindowsEx :
Code c++ : | Sélectionner tout |
ExitWindowsEx(EWX_LOGOFF,0);
Par exemple :
Code c++ : | Sélectionner tout |
ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0);
Pour mettre l'ordinateur en veille, il faut faire appel à la fonction SetSystemPowerState :
Code c++ : | Sélectionner tout |
SetSystemPowerState(False,True);
Cette fonction ne fonctionnera avec les systèmes NT que si l'application dispose du privilège SE_SHUTDOWN_NAME.
Pour redémarrer l'ordinateur, il faut faire appel à la fonction ExitWindowsEx :
Code c++ : | Sélectionner tout |
ExitWindowsEx(EWX_REBOOT,0);
Par exemple :
Code c++ : | Sélectionner tout |
ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);
Pour éteindre l'ordinateur, il faut faire appel à la fonction ExitWindowsEx :
Code c++ : | Sélectionner tout |
ExitWindowsEx(EWX_SHUTDOWN,0);
Pour éteindre complètement l'ordinateur, il faut utiliser le flag EWX_POWEROFF à la place de EWX_SHUTDOWN.
Remarque : pour forcer les applications à se terminer, il est possible d'utiliser le flag EWX_FORCE en complément d'un des 2 précédemment cités.
Par exemple :
Code c++ : | Sélectionner tout |
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);
Il existe un certain nombre de constantes et variables définies par SysUtils.hpp qui permettent d'obtenir les informations adéquates.
Notamment, Win32Platform renvoie le type de plateforme utilisée : VER_PLATFORM_WIN32s, VER_PLATFORM_WIN32_WINDOWS ou VER_PLATFORM_WIN32_NT.
Pour affiner, il est ensuite nécessaire de consulter les variables Win32MajorVersion et Win32MinorVersion, ainsi que Win32CSDVersion pour les Service Packs.
Pour obtenir la version de Windows installée sur le PC, C++ Builder fournit ainsi les variables Win32MajorVersion et Win32MinorVersion, entre autres. On peut en déduire la version de Windows à l'aide du code suivant :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | AnsiString __fastcall GetWindowsVersion() { AnsiString result; switch(Win32MajorVersion) { case 3: result = "Windows NT 3.51";break; case 4: switch(Win32MinorVersion) { case 0: switch (Win32Platform) { case 1: { switch (Win32CSDVersion[1]) { case 'A': result = "Windows 95 SP 1";break; case 'B': result = "Windows 95 SP 2";break; } break; } case 2: result = "Windows NT 4.0";break; } break; case 10: switch (Win32CSDVersion[1]) { case 'A': result = "Windows 98 SP 1";break; case 'B': result = "Windows 98 SP 2";break; } break; case 90: result = "Windows ME";break; } break; case 5: switch (Win32MinorVersion) { case 0: result = "Windows 2000";break; case 1: result = "Windows XP";break; case 2: result = "Windows 2003";break; } break; } if (result.IsEmpty()) { result = "Inconnue"; } return result; } |
Le code suivant renvoie le nom de la machine :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | AnsiString __fastcall GetMac() { AnsiString mac(""); DWORD t_computer(MAX_COMPUTERNAME_LENGTH + 1); char *name_computer=new char[t_computer]; if( GetComputerName(name_computer, &t_computer) ) { mac=AnsiString(name_computer); } delete[] name_computer; return mac; } |
Le code suivant retourne le nom de l'utilisateur connecté :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | AnsiString __fastcall GetUser() { AnsiString user(""); DWORD t_user(256); char *name_user=new char[t_user]; if( GetUserName(name_user, &t_user) ) { user=AnsiString(name_user); } delete[] name_user; return user; } |
Voici une petite fonction qui permet de modifier le paramètre d'affichage de la barre des tâches en libérant l'espace (ce n'est pas un Hide()) :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //change la propriété de la barre de tâches _AppBarData TaskBar; TaskBar.hWnd = FindWindow("Shell_TrayWnd", NULL); TaskBar.cbSize = sizeof(TaskBar); if((UINT) SHAppBarMessage(ABM_GETSTATE, &TaskBar) == ABS_ALWAYSONTOP) { TaskBar.lParam = ABS_AUTOHIDE ; } else { TaskBar.lParam = ABS_ALWAYSONTOP; } if( (UINT) SHAppBarMessage(ABM_SETSTATE, &TaskBar) == false ) { Application->MessageBox("Erreur de changement de propriété", "Erreur", MB_OK); } |
Je m'intéresse tout particulièrement à TaskBar.lParam qui correspond à l'affichage de la barre. Ce paramètre peut prendre plusieurs valeurs dont voici la liste :
Liste de valeurs extraite de la documentation
- ABM_ACTIVATE : Notifies the system that an appbar has been activated.
- ABM_GETAUTOHIDEBAR : Retrieves the handle to the autohide appbar associated with a particular edge of the screen.
- ABM_GETSTATE : Retrieves the autohide and always-on-top states of the Microsoft Windows taskbar.
- ABM_GETTASKBARPOS : Retrieves the bounding rectangle of the Windows taskbar.
- ABM_NEW : Registers a new appbar and specifies the message identifier that the system should use to send notification messages to the appbar.
- ABM_QUERYPOS : Requests a size and screen position for an appbar.
- ABM_REMOVE : Unregisters an appbar, removing the bar from the system's internal list.
- ABM_SETAUTOHIDEBAR : Registers or unregisters an autohide appbar for an edge of the screen.
- ABM_SETPOS : Sets the size and screen position of an appbar.
- ABM_SETSTATE : Sets the state of the appbar's autohide and always-on-top attributes.
- ABM_WINDOWPOSCHANGED : Notifies the system when an appbar's position has changed.
Une fois connue, soit je le modifie pour un affichage "Masqué automatiquement" ou "Toujours affiché".
On peut voir que cette fonction peut permettre de modifier d'autres paramètres de la barre ... Par ailleurs, la commande ABM_SETSTATE permet d'appliquer la modification.
On pourrait utiliser la fonction IsUserAnAdmin() mais elle semble poser problème avec l'inclusion de " shlobj.h " (voir les erreurs générées) :
Code c++ : | Sélectionner tout |
1 2 3 4 5 | -------------------------------------------------------------------------------- [C++ Error] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS' [C++ Error] shobjidl.h(8095): E2238 Multiple declaration for 'DESKBANDINFO' [C++ Error] shlobj.h(1422): E2238 Multiple declaration for 'FVSHOWINFO' -------------------------------------------------------------------------------- |
Cela semble bien être la faute à BCB : http://bdn.borland.com/article/0,1410,26650,00.html
[C++ Error] shlobj.h(3457) : E2238 Multiple declaration for 'SHELLFLAGSTATE'
Pour déterminer si un utilisateur est administrateur ou non, on examine l'accès utilisateur à l'aide de la fonction GetTokenInformation(). Ces informations représentent les droits de l'utilisateur et le groupe auquel il appartient.
Quand l'utilisateur lance une application, ses droits d'accès y sont associés. Pour examiner ses droits, on utilise la fonction OpenProcessToken().
Ce code est proposé dans la rubrique d'aide de Windows (Win32.hlp).
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | BOOL IsAdmin(void) { HANDLE hProcess, hAccessToken; UCHAR InfoBuffer[1024]; PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer; DWORD dwInfoBufferSize; PSID psidAdministrators; SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY; UINT x; hProcess = GetCurrentProcess(); if(!OpenProcessToken(hProcess,TOKEN_READ,&hAccessToken)) return(FALSE); if(!GetTokenInformation(hAccessToken,TokenGroups,InfoBuffer, 1024, &dwInfoBufferSize)) return(FALSE); AllocateAndInitializeSid(&siaNtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &psidAdministrators); for(x=0;x<ptgGroups->GroupCount;x++) { if( EqualSid(psidAdministrators, ptgGroups->Groups[x].Sid) ) { FreeSid(&psidAdministrators); return( TRUE ); } } FreeSid(&psidAdministrators); return(FALSE); } |
Cette fonction déclenche une fenêtre CPU lors de l'exécution de la ligne de libération de la structure de type SID, en mode debug. Ce problème n'intervient pas dans l'exécutable généré. |
Comment charger le papier peint du bureau dans un TImage ?
Cette opération s'effectue en utilisant l'API SystemParametersInfo avec la commande SPI_GETDESKWALLPAPER.
Cette API est décrite sur le site de msdn.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | char path[200]; // Récupère le chemin de l'image utilisée comme papier peint if(SystemParametersInfo( SPI_GETDESKWALLPAPER, 200, path, 0) == TRUE) { AnsiString Chemin; float i=0; // Garde la proportion de l'écran pour l'affichage de l'image Image1->Picture->LoadFromFile(path); i = (float)Screen->Height/(float)Screen->Width; Image1->Height = i * Image1->Width; } |
Comment établir une image comme papier peint du bureau ?
On utilise la même API que pour la lecture, mais on utilise la commande SPI_SETDESKWALLPAPER. Ici l'image est chargée par un OpenDialog, puis modifiée et écrasée avant d'être établie comme papier peint.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | if(OpenDialog1->Execute()) { Image1->Picture->LoadFromFile(OpenDialog1->FileName); Image1->Canvas->TextOutA(10,10,"modif de l'image par Builder"); Image1->Picture->SaveToFile(OpenDialog1->FileName); if(SystemParametersInfo( SPI_SETDESKWALLPAPER, OpenDialog1->FileName.Length(), OpenDialog1->FileName.c_str(), WM_SETTINGCHANGE) != TRUE) { Button2->Caption = "Erreur"; } } |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.