Une fenêtre qui se sauve quand on passe dessus, stoppe ctrl-alt-sup

Description

Bonjour à tous,
Bon voilà c'est mon premier petit programme en C++ (je viens du PHP et c'est pas pareil, lol).
Bon d'accord il ne fait rien en soit, mais il permet de voir pour les novices (comme moi) comment :
- Ouvrir une fenêtre
- Inter-agir avec les évènements: souris-clavier
- Fermer une fenêtre quand il y a un survol de souris, et exécuter un programme.
- Exécuter un programme quand on clique sur Alt-F4
- Comment agir avec le Focus et légèrement détourner Ctrl-Alt-Sup

Bon voilà, un peu d'indulgence serait sympa.
J'ai fait ça parce que c'est plus facile d'apprendre en faisant des "petites conneries" que de s'atteler directement à des programmes lourds. J'espère pouvoir faire des prog intéressant un jour quand même... ;-)

Enfin un gros merci à Brunews et à la communauté qui m'ont indirectement aidé grâce à la lecture des nombreux messages du forum.

Source / Exemple :


#include <windows.h>
#include <stdlib.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName [] = TEXT ("avion") ;
     HBITMAP      hBitmap ;
     HBRUSH       hBrush ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASSEX     wndclass;

     hBitmap = LoadBitmap (hInstance, TEXT ("avion")) ;
     hBrush = CreatePatternBrush (hBitmap) ;
     DeleteObject (hBitmap) ;

HDC hDc=GetDC(GetDesktopWindow());      //On récupère la résolution de l'écran
int nVert=GetDeviceCaps(hDc, VERTRES);  //On prend la résolution verticale
int nHori=GetDeviceCaps(hDc, HORZRES);  //On prend la résolution horizontale

srand(GetTickCount());                  //      Servira à positionner la fenêtre dans l'écran
int posvert = rand()%(nVert - 50);      //On prend un nombre aléatoire entre 0 et la définition verticale de l'écran  moins 50
srand(GetTickCount());                  //      On retire 50 pour que au moins il y ai un morceau de 50 pixel sur 50 qui soit visible
int poshori = rand()%(nHori - 50);      //On prend un nombre aléatoire entre 0 et la définition horizontale de l'écran  moins 50

	wndclass.cbSize=sizeof(WNDCLASSEX);
	wndclass.style=CS_HREDRAW|CS_VREDRAW;
	wndclass.lpfnWndProc=WndProc;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hInstance=hInstance;
	wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground=hBrush ;
	wndclass.lpszMenuName=NULL;
	wndclass.lpszClassName="std";
	wndclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
	RegisterClassEx(&wndclass);

  	hwnd=CreateWindowEx(WS_EX_TOPMOST,	"std",
		"Avion",		WS_SYSMENU,
		poshori,  posvert,              //On place la fenêtre grâce aux calculs précédents
		124,	92,                       //Taille de la fenêtre
		NULL,		NULL,
		hInstance,		NULL		);

     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;

     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }

     DeleteObject (hBrush) ;
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{  char szEXE[256];
    
     switch (message)
     {
     case WM_DESTROY:                                 //Si on clique sur la croix (ou Alt-F4)
       MessageBeep(0);                                //Alors un beep puis:
     GetModuleFileName(NULL, szEXE, sizeof(szEXE));   //On récupère le chemin du programme
     ShellExecute(NULL,"open",szEXE,0,0,SW_NORMAL);   //On exécute deux
     ShellExecute(NULL,"open",szEXE,0,0,SW_NORMAL);   //fois le programme
     PostQuitMessage (0) ;                            //On ferme la fenêtre initiale
         return 0 ;

     case WM_MOUSEMOVE:                           //Si la souris passe sur la fenêtre
   GetModuleFileName(NULL, szEXE, sizeof(szEXE)); //On récupère le nom de l'exécutable, car on peut ainsi le renommer
   ShellExecute(NULL,"open",szEXE,0,0,SW_NORMAL); //On l'exécute.
    PostQuitMessage (0) ;                         //On ferme la première fenêtre. Cela donne une impression de déplacement; de fuite de la fenêtre
    return 0 ;

        case WM_KILLFOCUS:                        //Si la fenêtre perd le focus
        HWND hWindow = 0;
        Sleep(200);                               //On attend 200ms
        hWindow = FindWindow(NULL,"Gestionnaire des tâches de Windows");
        if (!hWindow){}                           //Si la fenêtre est le gestionnaire des tâches
        else 
        PostMessage(hWindow, WM_CLOSE, 0, 0);     //On le ferme
      return 0 ;
    }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

Conclusion :


Et au fait, j'ai mis "légèrement détourner Ctrl-Alt-Sup" car il n'est pas arrêter à tous les coups.
Je m'explique:
Pour arrêter mon prog si vous appuyer sur:
CONTROL ALT SUPPR une seule fois, le taskmanager va disparaitre.
Mais si vous appuyer à répétition sur SUPPR, alors il s'ouvrira et vous chercherer mon programme pour l'arrêter. mais pas dans APPLICATION, car il se dupliquera.
Il faut aller dans PROCESSUS.

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.