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


SommaireSystèmeSystème Divers (12)
précédent sommaire suivant
 

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);
Si vous rencontrez un problème à l'inclusion de shlobj.h il vous faudra modifier les fichiers shobjidl.h et shlobj.h comme suit :

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;

Mis à jour le 1er septembre 2004 Geronimo Ricky81

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);
Pour réactiver le bureau, il vous suffit de reproduire le code suivant :

Code c++ : Sélectionner tout
1
2
HWND Bureau = FindWindow("Progman", "Program Manager"); 
ShowWindow(Bureau, SW_SHOW);

Mis à jour le 1er septembre 2004 Geronimo Ricky81

Pour fermer une session Windows, il faut faire appel à la fonction ExitWindowsEx :

Code c++ : Sélectionner tout
ExitWindowsEx(EWX_LOGOFF,0);
Remarque : pour forcer les applications à se terminer, il est possible d'utiliser le flag EWX_FORCE en complément de EWX_LOGOFF.
Par exemple :

Code c++ : Sélectionner tout
ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0);

Mis à jour le 1er septembre 2004 Ricky81

Pour mettre l'ordinateur en veille, il faut faire appel à la fonction SetSystemPowerState :

Code c++ : Sélectionner tout
SetSystemPowerState(False,True);
Le code précédent met l'ordinateur en veille en utilisant la technique d'hibernation et envoie le message de mise en veille aux applications sans attendre de réponse.

Cette fonction ne fonctionnera avec les systèmes NT que si l'application dispose du privilège SE_SHUTDOWN_NAME.

Mis à jour le 1er septembre 2004 Ricky81

Pour redémarrer l'ordinateur, il faut faire appel à la fonction ExitWindowsEx :

Code c++ : Sélectionner tout
ExitWindowsEx(EWX_REBOOT,0);
Remarque : pour forcer les applications à se terminer, il est possible d'utiliser le flag EWX_FORCE en complément de EWX_REBOOT.
Par exemple :

Code c++ : Sélectionner tout
ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);
Cette fonction ne fonctionnera avec les systèmes NT que si l'application dispose du privilège SE_SHUTDOWN_NAME.

Mis à jour le 1er septembre 2004 Ricky81

Pour éteindre l'ordinateur, il faut faire appel à la fonction ExitWindowsEx :

Code c++ : Sélectionner tout
ExitWindowsEx(EWX_SHUTDOWN,0);
Le code précédent ferme Windows mais n'éteint pas nécessairement l'ordinateur.
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);
Cette fonction ne fonctionnera avec les systèmes NT que si l'application dispose du privilège SE_SHUTDOWN_NAME.

Mis à jour le 1er septembre 2004 Geronimo

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; 
}
Cette méthode permet d'obtenir simplement le nom du système d'exploitation. Il est cependant possible d'obtenir des informations plus détaillées (numéro de construction, pro/perso, etc.) en utilisant les fonctions de l'API Windows. Cette méthode un peu plus longue est donnée dans le fichier zip ci-dessous.

Mis à jour le 25 avril 2005 Greybird Ricky81

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; 
}

Mis à jour le 6 décembre 2006 ksly

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; 
}

Mis à jour le 10 décembre 2007 ksly

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 déclare une structure TaskBar du même type que celle de la barre de tâches windows (type _AppBarData), ensuite je récupère le Handle de la barre de tâche pour lire ses paramètres.
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.

Mis à jour le 6 décembre 2006 bandit boy

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é.

Mis à jour le 10 décembre 2007 bandit boy pottiez

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"; 
   } 
}

Mis à jour le 10 décembre 2007 bandit boy pottiez

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2020 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.