Comment faire du gruyère de vos fenêtres en api win32

Description

Un petit prog qui mange vos fenêtres petit à petit :)
Ne vous inquiétez pas, ce n'est pas un virus et ça ne détruit en rien vos données. Il fait juste des trous à vos fenêtres, comme du gruyère.

ATTENTION : âmes sensible s'abstenir! Si vous possedez win9x et que vous n'avez aucun accès aux processus, il ne vous restera qu'un moyen pour arrêter ce programme une fois lancé : rebooter!
NOTE que je ne devrais pas à avoir à écrire : ce programme est JUSTE pour montrer ce que l'on peut faire avec les API de windows! Ne vous en servez pas pour faire des plaisanteries autour de vous!
Vous êtes prévenu et je vous considère suffisamment responsable.

Je met le code ici, mais vous le trouverez aussi dans le zip.

Source / Exemple :


//**Dev par KPTN**

#include <windows.h>
#include <stdlib.h>
#include <time.h>

VOID CALLBACK TimeProc(
  HWND hwnd,         // handle to window
  UINT uMsg,         // WM_TIMER message
  UINT_PTR idEvent,  // timer identifier
  DWORD dwTime       // current system time
);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	//Génération d'une suite pseudo aléatoire
	srand( (unsigned)time( NULL ) );

	//Initialisation du timer et de l'appli
	SetTimer(NULL, NULL, 10, (TIMERPROC)TimeProc);
       	WNDCLASS lpWndClass;
	lpWndClass.lpfnWndProc = NULL;
	lpWndClass.hInstance = hInstance;
	RegisterClass(&lpWndClass);
	MSG msg;
	BOOL bRet;

	//Récupération des messages
	while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
	{
	  if (bRet != -1)
	  {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	  }
	}
	return 0;
}

VOID CALLBACK TimeProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
HWND hWnd2;
int w, h;
int nTaille, nX, nY;
RECT r;
	
	//Récupération de la fenêtre avant
	hWnd2 = GetForegroundWindow();
	//Récupération de la taille de la fenêtre
       GetWindowRect(hWnd2, &r);

	//Détermination de la taille et lieu des trous
       nTaille = ((double)rand()/RAND_MAX) * (100);
       nX = ((double)rand()/RAND_MAX) * (r.right-r.left);
       nY = ((double)rand()/RAND_MAX) * (r.bottom-r.top);

	//Récupération de la région existante
       HRGN Region = CreateRectRgn(0,0,0,0);
       int nRgnType = GetWindowRgn( hWnd2, Region );
       switch (nRgnType) {
           case NULLREGION :
           case ERROR :
              Region = CreateRectRgn(0, 0, r.right-r.left, r.bottom-r.top);
              break;
           case SIMPLEREGION :
           case COMPLEXREGION :
           default :
               break;
       }
	//Création du trou
       HRGN SubRegion = CreateEllipticRgn(nX, nY, nX+nTaille, nY+nTaille);
       CombineRgn(Region,Region,SubRegion,RGN_DIFF);

	//Mise à jour de la région de la fenêtre
       SetWindowRgn(hWnd2,Region,true);

	//Libération des objets
       DeleteObject(SubRegion);

}

Conclusion :


Ce code est sous VC++ 6 mais peut tout aussi bien tourner sous n'importe quel compilateur.

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.