| auteur : Pierre Castelain | Il peut parfois être utile de récupérer le texte affiché dans la barre de titre d'une fenêtre quelconque (en dehors de notre application). C'est très facile à réaliser à l'aide des fonctions de l'API Windows.
Dans l'exemple qui suit, nous récupérons le Caption de la fenêtre active.
AnsiString __fastcall TForm1:: GetACtiveWindowCaption ()
{
HWND hwnd;
hwnd = GetForegroundWindow ();
char * caption = new char [255 ];
int length = GetWindowText (hwnd,caption,254 );
caption[length] = ' \0 ' ;
return AnsiString (caption);
}
|
|
lien : Qu'est ce qu'un HANDLE ?
|
| auteur : Nono40 |
Le composant TProgressBar ne dispose pas de propriété Color. Par contre il existe un message Windows pour modifier directement le contrôle : PBM_SETBARCOLOR. Il suffit d'envoyer ce message au contrôle barre de progression via son Handle avec les paramètres adéquats pour positionner la couleur voulue.
SendMessage (ProgressBar1- > Handle,PBM_SETBARCOLOR,0 ,clLime);
|
|
lien : Qu'est ce qu'un HANDLE ?
|
| auteurs : Netah25, Greybird | Si votre application doit disposer d'un privilège, pour certains actions (comme par exemple demander l'extinction du poste de travail), vous pourrez utiliser la fonction ci-dessous. Notez qu'il est conseillé de toujours retirer un privilège une fois l'action effectuée.
La fonction suivante donne ou retire (suivant la valeur du paramètre grant le privilège donné en paramètre name :
bool __fastcall SetPrivilege (AnsiString name, bool grant)
{
TOKEN_PRIVILEGES wTokenIn, wTokenOut;
DWORD wLength;
HANDLE wCurrentProcess, wToken;
_LUID wLuid;
bool ret;
wCurrentProcess = GetCurrentProcess ();
OpenProcessToken (wCurrentProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, & wToken);
LookupPrivilegeValue (NULL , name.c_str (), & wLuid);
wTokenIn.PrivilegeCount = 1 ;
wTokenIn.Privileges[0 ].Luid = wLuid;
wTokenIn.Privileges[0 ].Attributes = (grant?SE_PRIVILEGE_ENABLED:0 );
ret = AdjustTokenPrivileges (wToken, FALSE, & wTokenIn, sizeof (TOKEN_PRIVILEGES), & wTokenOut,& wLength))
CloseHandle (wToken);
return ret;
}
|
Par exemple, pour ajouter le paramètre SE_SHUTDOWN_NAME, effectuer une action, et retirer le privilège, en nous basant sur les informations du MSDN listant les constantes d'autorisation (voir plus bas), nous allons utiliser :
SetPrivilege (" SeShutdownPrivilege " ,true );
SetPrivilege (" SeShutdownPrivilege " ,false );
|
|
lien : MSDN - Authorization constants
|
| auteur : Greybird |
On a parfois besoin de connaître le nom de classe d'une fenêtre. Ce nom s'obtient via la fonction GetClassName de l'API Windows. Cette fonction a besoin d'un Handle vers la fenêtre dont on désire obtenir le nom.
En général, cette situation se produira lors du développement, afin d'obtenir les données nécessaire à la programmation de l'interaction avec une fenêtre d'une autre application.
Le code (application console) ci-dessous montre comment réaliser un petit utilitaire permettant d'obtenir le nom de classe de la fenêtre située au premier plan. Pour l'utiliser, il faut créer une application console (Fichier | Nouveau | Autre, puis choisir Expert Console).
# include <windows.h>
# include <stdio.h>
# include <conio.h>
int main (int argc, char * argv[])
{
HWND hFore;
char * pszBuffer;
int iNbChar = 1 ;
int iNbCharReturned;
printf (" Vous avez 5 secondes pour activer la fenetre dont vous voulez connaitre le class name\r\n " );
printf (" Appuyez sur une touche pour declancher le compteur ... " );
getch ();
Sleep (5000 );
hFore = GetForegroundWindow ();
do
{
iNbChar = iNbChar * 2 ;
pszBuffer = new char [iNbChar];
iNbCharReturned = GetClassName (hFore,pszBuffer,iNbChar);
if (iNbCharReturned = = 0 )
{
printf (" Impossible de recuperer le class name\r\n " );
}
if (iNbCharReturned < (iNbChar - 1 ))
{
printf (" \r\nLe class name de cette fenetre est :\r\n|%s| " ,pszBuffer);
printf (" \r\nLes barres verticales (|) de gauche et droite n'en font pas partie\r\n\a " );
}
delete [] pszBuffer;
}
while ((iNbCharReturned >= (iNbChar - 1 )));
printf (" Appuyez sur une touche pour fermer la fenetre... " );
getch ();
return 0 ;
}
|
|
lien : Qu'est ce qu'un HANDLE ?
lien : Comment obtenir le Handle d'une fenêtre non-crée par l'application ?
lien : MSDN : fonction GetClassName
|
| auteur : Bibmari |
Pour contrôler une fenêtre d'une application tierce, et lui envoyer des messages, il est nécessaire d'obtenir son Handle, qui sera de type HWND. Celui-ci est différent du Handle de processus, que l'on peut obtenir au moyen de CreateProcess ou ShellExecuteEx.
Ceci peut se réaliser au moyen de la fonction FindWindow de l'API Windows. Cette fonction prend en premier paramètre le nom de la classe de fenêtre recherchée, et en second le titre de cette fenêtre. Il est possible de positionner l'un de ces deux paramètres à NULL afin de ne pas utiliser le critère correspondant dans la recherche.
Etant donné que le titre de la fenêtre est beaucoup plus fluctuant que le nom de la classe de fenêtre, on cherchera toujours à préférer la recherche par nom de classe.
Pour obtenir ce nom de classe, il est possible d'utiliser un code fourni dans la FAQ (lien ci-dessous).
Le code suivant montre comment mettre une instance de la calculatrice Windows au premier plan, et lui envoyer un message indiquant l'appui sur la touche R (ce qui aura pour effet de déclencher la fonction inverse).
HWND h = FindWindow (" SciCalc " , NULL );
SetForegroundWindow (h);
PostMessage (h, WM_KEYDOWN, ' R ' , 0 );
PostMessage (h, WM_KEYUP, ' R ' , 0 );
|
|
lien : Qu'est ce qu'un HANDLE ?
lien : Comment trouver le Class Name d'une fenêtre ?
|
| auteurs : Bandit Boy, pottiez |
Pour forcer la fermeture d'un programme, il suffit de connaître le Handle de sa fenêtre, en utilisant pour cela la fonction FindWindow
qui prend en paramètre l'intitulé de la fenêtre (texte qui se trouve dans la barre de titre de la fenêtre). Ensuite la fonction GetWindowThreadProcessId
récupère l'ID du processus grâce au Handle. TerminateProcess ferme le programme.
Pour l'exemple "Calculatrice" est le programme a terminer :
HWND hWnd;
DWORD processId;
HANDLE hProcess;
do
{
hWnd = FindWindow (NULL ," Calculatrice " );
if (hWnd)
{
GetWindowThreadProcessId (hWnd,& processId);
hProcess = OpenProcess (PROCESS_TERMINATE,false ,processId);
if (hProcess)
{
TerminateProcess (hProcess,0 );
CloseHandle (hProcess);
}
}
}
while (hWnd);
}
|
|
Consultez les autres F.A.Q.
|
|