Accueil > > > API - QUELQUES EXEMPLES D'UTILISATIONS DES API WIN32
API - QUELQUES EXEMPLES D'UTILISATIONS DES API WIN32
Information sur la source
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
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, <pPSsize);
- //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, <pPSsize);
//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
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|