begin process at 2012 05 27 13:35:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > API - QUELQUES EXEMPLES D'UTILISATIONS DES API WIN32

API - QUELQUES EXEMPLES D'UTILISATIONS DES API WIN32


 Information sur la source

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Niveau :Débutant Date de création :19/12/2003 Date de mise à jour :22/12/2003 00:39:18 Vu / téléchargé :7 623 / 599

Auteur : Helkanen

Ecrire un message privé
Site perso
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Bon, inutile de s'étaler sur le sujet,
le titre parle de lui meme...

Voici les fonctions exploitées (plus ou moins) :
GetUserName
GetComputerName
GlobalMemoryStatu s
GetSystemDirectory
GetWindowsDirectory
GetTem pPath
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

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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   APIUse001
    •   Debug
      • APIUse001.exeTélécharger ce fichier [Réservé aux membres club]213 059 octets
    • APIUse001.dspTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 309 octets
    • APIUse001.dswTélécharger ce fichier [Réservé aux membres club]Voir ce fichier541 octets
    • APIUse001.ncbTélécharger ce fichier [Réservé aux membres club]214 016 octets
    • APIUse001.optTélécharger ce fichier [Réservé aux membres club]48 640 octets
    • APIUse001.plgTélécharger ce fichier [Réservé aux membres club]1 672 octets
    • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier26 147 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture [WIN32] CLASSE DE CONTROLE DE WINSOCK MODE MULTITHREAD
Source avec Zip Source avec une capture [WIN : QT -> VC++] ADAPTATEUR DE PROJET QT POUR VC++

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

Commentaires et avis

Commentaire de Helkanen le 19/12/2003 21:34:00

Merci de déposer des commentaires, des remarques pour l'optimisation de certaines utilisations d'API...
des choses constructives...
et svp évitez de me mettre 1/10 sans me donner une raison juste...

Helkanen

Commentaire de kuroro le 19/12/2003 21:58:33

scuz moi je suis un gros noob mai ce code m'interesse , il faut inclure quelle librairie ?

Commentaire de Helkanen le 19/12/2003 22:02:19

euh... si t'as Visual C++ 6, alors tu peux ouvrir le projet
sinon, tu peux toujours ouvrir le fichier main.cpp

alors voilà :
pour les cout, cin : #include &lt;iostream.h&gt;
pour les API win32 : #include &lt;windows.h&gt;
tout simplement
si t'es chaud, essaie de comprendre les codes d'abord des fonctions simples (ZIP) et ensuite de la fonction que j'ai donnée en exemple, car la plus complète et complèxe

bonne prog
Helkanen

Commentaire de Pamaury le 20/12/2003 09:16:11

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 .

Commentaire de Helkanen le 20/12/2003 19:13:49

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

Commentaire de deck_bsd le 06/10/2005 20:06:49

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

Commentaire de Helkanen le 11/10/2005 19:04:38

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++

Commentaire de deck_bsd le 12/10/2005 17:46:38

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

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,952 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales