Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

Vous n'avez pas encore de compte Developpez.com ? L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Developpez.com

C++

Choisissez la catégorie, puis la rubrique :

logo
Sommaire > Système > Divers
        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 ?



Comment ajouter une entrée aux Documents récemment ouverts de Windows ?
Créé le 01/09/2004[haut]
auteurs : Geronimo, Ricky81
Pour ajouter une entrée, il vous faut utiliser la fonction SHAddToRecentDocs (shlobj.h) et l'appeler comme suit :

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;


Comment masquer les icônes du bureau ?
Créé le 01/09/2004[haut]
auteurs : 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, ...).

HWND Bureau = FindWindow("Progman", "Program Manager");
ShowWindow(Bureau, SW_HIDE);
Pour réactiver le bureau, il vous suffit de reproduire le code suivant :

HWND Bureau = FindWindow("Progman", "Program Manager");
ShowWindow(Bureau, SW_SHOW);

Comment fermer une session Windows ?
Créé le 01/09/2004[haut]
auteur : Ricky81
Pour fermer une session Windows, il faut faire appel à la fonction ExitWindowsEx :

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 :

ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0);

Comment mettre en veille l'ordinateur ?
Mise à jour le 21/06/2006[haut]
auteur : Ricky81
Pour mettre l'ordinateur en veille, il faut faire appel à la fonction SetSystemPowerState :

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.

lien : faq Comment donner un privilege à une application ?

Comment redémarrer l'ordinateur ?
Mise à jour le 21/06/2006[haut]
auteur : Ricky81
Pour redémarrer l'ordinateur, il faut faire appel à la fonction ExitWindowsEx :

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 :

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.

lien : faq Comment donner un privilege à une application ?

Comment éteindre l'ordinateur ?
Mise à jour le 21/06/2006[haut]
auteur : Geronimo
Pour éteindre l'ordinateur, il faut faire appel à la fonction ExitWindowsEx :

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 :

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.

lien : faq Comment donner un privilege à une application ?

Comment obtenir la version de Windows ?
Mise à jour le 06/12/2006[haut]
auteurs : Greybird, Ricky81
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 :

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.

lien : en MSDN - GetVersionEx
lien : en MSDN : Getting the System Version
téléchargement : windowsversion.zip

Comment obtenir le nom de la machine ?
Créé le 06/12/2006[haut]
auteur : ksly
Le code suivant renvoie le nom de la machine :

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

Comment obtenir le login de l'utilisateur connecté ?
Créé le 10/12/2007[haut]
auteur : ksly
Le code suivant retourne le nom de l'utilisateur connecté :

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

Comment paramétrer l'affichage de la barre des tâches ?
Créé le 06/12/2006[haut]
auteur : Bandit Boy
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()) :


//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 :

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

lien : en Lien vers l'API

Comment tester si un compte est administrateur ?
Créé le 10/12/2007[haut]
auteurs : Bandit Boy, pottiez

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) :

--------------------------------------------------------------------------------
[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).

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

Attention :
Cette fonction déclenche une fenêtre CPU lors de l'éxé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 modifier le papier peint du bureau ?
Créé le 10/12/2007[haut]
auteurs : 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.

    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.

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


Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

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 © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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.

Contacter le responsable de la rubrique C++

Partenaire : Hébergement Web