Api - quelques exemples d'utilisations des api win32

Soyez le premier à donner votre avis sur cette source.

Vue 9 133 fois - Téléchargée 718 fois

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

Ajouter un commentaire Commentaires
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
Snif lol c'est dommage. très dommage :D
Ben tu peu mettre vite fait celle que tu avait déjà utilisée lol je supose que celles-ci ne sont pas les seules que tu connaisait :D yerk yerk

++All
Messages postés
54
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
9 juin 2004

Ce qui est très con, c'est que je suis en ce moment en classe prépa donc j'ai pas franchement le temps pour ça (même pas du tout) et en plus je ne m'intéresse plus à Windows que pour savoir comment s'en débarasser au mieux. Je suis en revanche tout à fait incapable de faire des APIs pour linux, car je maîtrise pas encore assez la programmation sur cet OS et je suis pas près de la maîtriser...
a++
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
Salut,

Je trouve cette source très intéressente, elle ma bien aidée. Tu devrai continuer de mettre des APIs dedans , perso ca me serai bien utile.

Bonne continuation.

++All
Messages postés
54
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
9 juin 2004

oué bien sur...
je sais
je comptais le faire...
mais le but pour l'instant n'était que de montrer qqes aperçus des utilisations de l'api windows ttes betes
Messages postés
341
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
17 juin 2008
2
Salut, je trouve ton code très bien bien mais il serait peut-être intéressant de récupérer les modes dispo grâce à la fonction
"EnumDisplaySettings" plutôt que de mettre "1.640x480".... parce que 1600x1200, je pense pas que tous les écrans le supporte .
Afficher les 8 commentaires

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.