Api - quelques exemples d'utilisations des api win32

Description

Bon, inutile de s'étaler sur le sujet,
le titre parle de lui meme...

Voici les fonctions exploitées (plus ou moins) :
GetUserName
GetComputerName
GlobalMemoryStatus
GetSystemDirectory
GetWindowsDirectory
GetTempPath
et, plus intéressant, on peut modifier la résolution de l'écran :
ZeroMemory, puis EnumDisplaySettings et enfin : ChangeDisplaySettings
mais aussi, on peut arreter l'ordinateur en forçant l'arrêt des programmes...
InitiateSystemShutdown et AbortSystemShutdown

de plus,
j'ai rajouté quelques fonctions bien pratiques pour faciliter les questions-réponses avec l'utilisateur

Il n'y a pas beaucoup de commentaires pour deux raisons :
le code est assez simple pour être compris par beaucoup (dont moi-même !!!)
je ne suis pas vraiment habilité à utiliser des termes que je ne maitrise pas suffisament...
cependant, il y a suffisamment de commentaires, avec en plus les sorties écran pour comprendre le code (du moins je l'espère)

Source / Exemple :


//pour changer la résolution de l'écran
int chgScreenResolution()
{
	DEVMODE dvMode;							//variable de stockage et d'échange des infos d'affichage
	ZeroMemory(&dvMode, sizeof(dvMode));	//remplit la case mémoire par des 0
	dvMode.dmSize = sizeof(dvMode);			//change un paramètre pour le bon fonctionnement de la fonction
	EnumDisplaySettings(0, ENUM_CURRENT_SETTINGS, &dvMode);	//récupère les valeurs actuelles

	//unsigned long lProfondeurBit = 32;
	unsigned long lWidth;
	unsigned long lHeight;
	
	cout << "\n\nAFFICHAGE ECRAN" << endl;
	cout << "L'affichage est actuellement defini a : " << dvMode.dmPelsWidth << " * " << dvMode.dmPelsHeight << " pixels" << endl;
	cout << "Les couleurs sont codees en " << dvMode.dmBitsPerPel << " bits" << endl;
	
	int iChoix;

	cout << "Voulez-vous changer de parametres d'affichage (o/n) ?" << endl;
	if (askYesNo())
	{
			char cListe[255];
			char cKeys[255];
			int iReturn = 1;
			DEVMODE dvListe[255];
			int iNo = 1;
			int iIndex = 1;
			int i = 1;
			bool bExisteDeja = false;
			
		cout << "Voici differents modes envisageables :" << endl;

			while (iReturn != 0)
			{
				iReturn = EnumDisplaySettings(0, iNo, &dvListe[iIndex]);
				//on fait une sélection :
				//que les 16 et 32 bits
				//de 640 à 1600 pixels
				if (iReturn != 0)
				{
					if (dvListe[iIndex].dmBitsPerPel > 8)
					{
						if ((dvListe[iIndex].dmPelsWidth == 640) |
							(dvListe[iIndex].dmPelsWidth == 800) |
							(dvListe[iIndex].dmPelsWidth == 1024)|
							(dvListe[iIndex].dmPelsWidth == 1280)|
							(dvListe[iIndex].dmPelsWidth == 1600))
						{
							//scanne dans la liste pour voir si le mode existe déjà
							for (i=1; i<iIndex; i++)
							{
								//cout << "Scanning : " << i << ". " << dvListe[i].dmPelsWidth << " * " << dvListe[i].dmPelsHeight << " / " << dvListe[i].dmBitsPerPel << " bits" << endl;
								if ((dvListe[iIndex].dmPelsWidth  == dvListe[i].dmPelsWidth) &
									(dvListe[iIndex].dmPelsHeight == dvListe[i].dmPelsHeight) &
									(dvListe[iIndex].dmBitsPerPel == dvListe[i].dmBitsPerPel))
								{
									bExisteDeja = true;
									break;
								}
							}
							if (!bExisteDeja)
							{
								cout << iIndex << ". " << dvListe[iIndex].dmPelsWidth << " * " << dvListe[iIndex].dmPelsHeight << " / " << dvListe[iIndex].dmBitsPerPel << " bits" << endl;
								iIndex++;
							}
							bExisteDeja = false;
						}
					}
				}
				iNo++;
			}

		cout << "0. Pas de modification de resolution" << endl;
		cout << "Votre choix : ";
		
		cin >> iChoix;

		//cChoix = askForKey("123450", 6);
		
		if (iChoix == 0)
		{
			cout << "Aucune modification ne va etre appliquee..." << endl;
		}
		else
		{
			if (iChoix <= iIndex)
			{
				if (MessageBox(GetDesktopWindow(),
						   "Etes-vous sûr de vouloir changer de résolution ?",
						   "Attention !",
						   (MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2|MB_TOPMOST))
					== IDYES)
				{
					dvMode = dvListe[iChoix];
					
					cout << "Largeur : " << dvMode.dmPelsWidth
						 << "\nHauteur : " << dvMode.dmPelsHeight
						 << "\nCouleur : " << dvMode.dmBitsPerPel << " bits"
						 << endl;
					cout << "Application des modifications..." << endl;
					ChangeDisplaySettings(&dvMode, 0);
				}
			}
			else
			{
				cout << "Cette valeur est trop grande, aucun mode n'y est associe." << endl;
			}
		}

	}

	return 0;
}

/* Forcer l'arrêt de l'ordinateur */
/* Merci Nix pour le code VB !    */
int forceShutdown()
{
	/* Interactions */
	int iShutType = 0;				//type d'arret = la valeur correspondant à l'action effectuée
	//int  iRep;					//retour de la fonction API

	bool bTrue = true;
	bool bFalse = false;

	/* Parametres */
	int iDelay = 30;
	bool bForceShutdown = false;
	bool bReboot = false;
	char sMessage[] = "L'arret a ete initie par HelkAPIUse.";

	cout << "\n\nARRET DE WINDOWS (1)" << endl;
	cout << "Voulez-vous forcer l'arret de windows ? (o/n)" << endl;

	if (askYesNo())
	{
		/* Il y a un problème dans l'utilisation de InitiateSystemShutdown, qui renvoie 0 (=false)
		   alors on ajuste les privilèges du processus :

  • /
adjustPrivileges(); cout << "L'arret a ete demande. Un message systeme va apparaitre..." << endl; cout << "Pour annuler, appuyez sur la touche 'a' " << endl; InitiateSystemShutdown(NULL, sMessage, 30, true, true); if (waitForKey(30000, 97) == true) { cout << "Annulation en cours..." << endl; AbortSystemShutdown(NULL); } } else { iShutType = 0; } /**/ //cout << "Press any key to continue (if you find the key 'any')..."; //getch(); return iShutType; } /* Ajuste les privilèges pour pouvoir initialiser l'arret de l'ordi */ int adjustPrivileges() { //récupère le pointeur vers le processus actuel HANDLE hProc; hProc = GetCurrentProcess(); //? HANDLE hToken; OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, &hToken); //cout << "Processus 1 = " << hProc << " Processus 2 = " << hToken << endl; //? LUID lLuid; LookupPrivilegeValue("", SE_SHUTDOWN_NAME, &lLuid); //cout << "Lookup done" << endl; //? TOKEN_PRIVILEGES tpPriv; tpPriv.PrivilegeCount = 1; tpPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; tpPriv.Privileges[0].Luid = lLuid; //cout << "Token Privileges Prepares" << endl; //? unsigned long ltpPSsize; // = retour TOKEN_PRIVILEGES tpPreviousState; AdjustTokenPrivileges(hToken, false, &tpPriv, sizeof(tpPriv), &tpPreviousState, &ltpPSsize); //cout << "Token Privileges Adjuted" << endl; return 0; }

Conclusion :


Explications sur le changement de résolution d'écran :
tout d'abord, on demande si l'utilisateur veut changer de résolution
ensuite, on dresse la liste des modes possibles, en filtrant seulement quelques modes intéressants et classiques (800*600, 1024*768...) et avec suffisament de couleurs ;-)
c'est les EnumDisplaySettings(0, i, &dv)
on demande à l'utilisateur de choisir
Ensuite, on affiche un MessageBox qui demande une confirmation
et on applique les paramètres

Pour initialiser l'arret, le programme doit acquérir quelques droits d'admin (TokenPrivileges). pour cela j'utilise la fonction adjustPrivileges (voir la source ci-dessus)

Il n'y a rien d'extraordinaire là-dedans, mais je pense que c'est suffisamment clair pour pouvoir être exploité...
Pour plus d'infos, écrivez des commentaires
pour des précisions ou des conseils, bah c'est pareil (et même encore mieux)

Je n'utilise que des API windows classiques, donc cela devrait pouvoir fonctionner sur toute machine windows (w2k, nt et xp plus sur que 9x et me)

Helkanen

Codes Sources

A voir également

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.