begin process at 2012 02 12 10:49:17
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > DÉTOURNER LA FRAPPE CLAVIER

DÉTOURNER LA FRAPPE CLAVIER


 Information sur la source

Note :
10 / 10 - par 4 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Classé sous :clavier, hook, simuler, détourner, frappe Niveau :Débutant Date de création :04/09/2007 Vu / téléchargé :12 769 / 576

Auteur : racpp

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

 Description

En réponse à une question du forum, voici un code source montrant comment détourner la frappe au clavier pour afficher, lettre par lettre, un message personnalisé. Un hook global clavier est utilisé. L'astuce réside dans l'emploi de la fonction keybd_event() pour simuler l'appui sur des touches différentes de celles interceptées dans la fonction de hook. Les lettres majuscules et les lettres avec accent circoflexe ou tréma les plus courament utilisées sont traitées.
Pour tester l'exécutable, renommez le en detourneur.exe. Il fonctionne en tâche de fond. Pour regarder son effet, lancez le et essayez de taper du texte dans n'importe quelle application. Lisez le texte qui s'affiche au fur et à mesure de la frappe jusqu'à la fin pour voir comment le quitter.
Amusez-vous bien.

Source

  • #define _WIN32_WINNT 0x0500 // Windows 2000 et supérieur
  • #include <windows.h>
  • HHOOK hHook; // Handle du hook clavier
  • int position=0;// Indicateur de position dans la chaine à afficher
  • // Chaine à afficher:
  • char texte[]="Vous êtes victime d'un programme qui détourne la frappe au clavier pour afficher le présent texte. Pour l'arrêter appuyez sur CTRL + Q ou attendez 3 minutes.\n";
  • // Liste des lettres avec accent circonflexe ou tréma:
  • BYTE avecaccents[]={'â','ê','û','î','ô','ë','ï'};
  • // Liste des lettres sans accent circonflexe ni tréma:
  • BYTE sansaccents[]={'a','e','u','i','o','e','i'};
  • // Liste des flags indiquant l'utilisation de la touche SHIFT:
  • BYTE shifts[]={0,0,0,0,0,1,1};
  • /******************************* Fonction de gestion du hook ****************************/
  • LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam, LPARAM lParam)
  • {
  • // Vérifier si une touche est appuyée:
  • if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
  • {
  • // Obtenir pointeur sur structure KBDLLHOOKSTRUCT:
  • KBDLLHOOKSTRUCT* hookstruct = ((KBDLLHOOKSTRUCT*)lParam);
  • // S'assurer que l'appui sur les tpuches n'est pas simulé:
  • if(hookstruct->dwExtraInfo!=255)
  • {
  • // Vérifier si la touche "Q" est appuyée:
  • if(hookstruct->vkCode==0x51 )
  • {
  • // S'assurer que la touche Control est enfoncée:
  • if(GetKeyState(VK_CONTROL) & 0x8000)
  • {
  • // Envoyer le message de fermeture de l'application:
  • PostThreadMessage(GetCurrentThreadId(),WM_QUIT,0,0);
  • // Sauter les autres hooks:
  • return 1;
  • }
  • }
  • // Convertir le caractère courant en virtual-key code:
  • SHORT vcode=VkKeyScan(texte[position]);
  • SHORT vcode2;
  • // Si le caractère comporte un tréma ou accent circonflexe:
  • if(vcode==-1)
  • {
  • int i;
  • // Chercher le caractère dans la liste:
  • for(i=0; i<7; i++)
  • {
  • if((BYTE)texte[position]==avecaccents[i]) break;
  • }
  • // Si pas trouvé alors sauter les autres hooks:
  • if(i==7) return 1;
  • // Trouver le virtuel-key code de la lettre non accentuée correspondante:
  • vcode2=VkKeyScan(sansaccents[i]);
  • // Si tréma, simuler appui sur la touche SHIFT:
  • if(shifts[i]) keybd_event(VK_SHIFT,0,0,255);
  • // Simuler appui sur la dead-key de l'accent circonflexe et le tréma:
  • keybd_event(VK_OEM_6,26,0,255);
  • keybd_event(VK_OEM_6,26,KEYEVENTF_KEYUP,255);
  • // Si tréma simuler relachement de la touche SHIFT:
  • if(shifts[i]) keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,255);
  • }
  • // Si le caractère ne comporte ni tréma ni accent circonflexe, le traiter directement:
  • else vcode2=vcode;
  • // Obtenir la lettre:
  • BYTE lettre=LOBYTE(vcode2);
  • // Obtenir l'état des touches SHIFT,CTRL et ALT pour le caractère courant:
  • BYTE etat=HIBYTE(vcode2);
  • // Simuler l'appui sur la touche SHIFT pour les lettres majuscules:
  • if(etat==1) keybd_event(VK_SHIFT,0,0,255);
  • // Simuler l'appui sur la touche Alt Gr pour certains caractères:
  • if(etat==6)
  • {
  • keybd_event(VK_CONTROL,0,0,255);
  • keybd_event(VK_MENU,0,0,255);
  • }
  • // Simuler l'appui de la touche correspondant au caractère courant:
  • keybd_event(lettre,0,0,255);
  • keybd_event(lettre,0,KEYEVENTF_KEYUP,255);
  • // Simuler relachement dela touche SHIFT pour les lettres majuscules:
  • if(etat==1) keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,255);
  • // Simuler relachement de la touche Alt Gr pour certains caractères:
  • if(etat==6)
  • {
  • keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,255);
  • keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,255);
  • }
  • // Incrémenter notre indicateur de position dans la chaine à afficher:
  • position++;
  • // Si la fin de chaine est atteinte, mettre à 0 l'indicateur de position:
  • if(position==lstrlen(texte)) position=0;
  • // Sauter les autres hooks:
  • return 1;
  • }
  • }
  • // Renvoi des messages au sytème pour permettre d'autres hooks
  • return CallNextHookEx(hHook, nCode, wParam, lParam);
  • }
  • /********************************************************************************************/
  • /*********************************** Fonction WinMain ***************************************/
  • int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmd, int show)
  • {
  • // Créer le timer de chronométrage:
  • UINT_PTR timer=SetTimer(0,0,180000,0);// 3 minutes
  • // Lancer le hook clavier:
  • hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC) HookProc, hinst, 0);
  • // Boucle des messages:
  • MSG msg;
  • while (GetMessage(&msg, 0, 0, 0))
  • {
  • // Sortir de la boucle des messages si les 3 minutes sont écoulées:
  • if(msg.message==WM_TIMER && msg.wParam==timer) break;
  • }
  • // Arrêter le hook clavier:
  • UnhookWindowsHookEx(hHook);
  • // Détruire le timer:
  • KillTimer(0,timer);
  • // Quitter:
  • return 0;
  • }
  • /*********************************************************************************************/
#define _WIN32_WINNT  0x0500 // Windows 2000 et supérieur
#include <windows.h>

HHOOK hHook; // Handle du hook clavier
int position=0;// Indicateur de position dans la chaine à afficher

// Chaine à afficher:
char texte[]="Vous êtes victime d'un programme qui détourne la frappe au clavier pour afficher le présent texte. Pour l'arrêter appuyez sur CTRL + Q ou attendez 3 minutes.\n";
// Liste des lettres avec accent circonflexe ou tréma:
BYTE avecaccents[]={'â','ê','û','î','ô','ë','ï'};
// Liste des lettres sans accent circonflexe ni tréma:
BYTE sansaccents[]={'a','e','u','i','o','e','i'};
// Liste des flags indiquant l'utilisation de la touche SHIFT:
BYTE shifts[]={0,0,0,0,0,1,1};

/*******************************  Fonction de gestion du hook  ****************************/
LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam, LPARAM lParam)
{
	// Vérifier si une touche est appuyée:
	if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
	{
		// Obtenir pointeur sur structure KBDLLHOOKSTRUCT:
		KBDLLHOOKSTRUCT* hookstruct = ((KBDLLHOOKSTRUCT*)lParam);
		// S'assurer que l'appui sur les tpuches n'est pas simulé:
		if(hookstruct->dwExtraInfo!=255)
		{
			// Vérifier si la touche "Q" est appuyée:
			if(hookstruct->vkCode==0x51 )
			{
				// S'assurer que la touche Control est enfoncée:
				if(GetKeyState(VK_CONTROL) & 0x8000)
				{
					// Envoyer le message de fermeture de l'application:
					PostThreadMessage(GetCurrentThreadId(),WM_QUIT,0,0);
					// Sauter les autres hooks:
					return 1;
				}
			}
			// Convertir le caractère courant en virtual-key code: 
			SHORT vcode=VkKeyScan(texte[position]);
			SHORT vcode2;
			// Si le caractère comporte un tréma ou accent circonflexe:
			if(vcode==-1)
			{
				int i;
				// Chercher le caractère dans la liste:
				for(i=0; i<7; i++)
				{
					if((BYTE)texte[position]==avecaccents[i]) break;
				}
				// Si pas trouvé alors sauter les autres hooks:
				if(i==7) return 1;
				// Trouver le virtuel-key code de la lettre non accentuée correspondante:
				vcode2=VkKeyScan(sansaccents[i]);
				// Si tréma, simuler appui sur la touche SHIFT:
				if(shifts[i]) keybd_event(VK_SHIFT,0,0,255);
				// Simuler appui sur la dead-key de l'accent circonflexe et le tréma:
				keybd_event(VK_OEM_6,26,0,255);
				keybd_event(VK_OEM_6,26,KEYEVENTF_KEYUP,255);
				// Si tréma simuler relachement de la touche SHIFT:
				if(shifts[i]) keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,255);
			}
			// Si le caractère ne comporte ni tréma ni accent circonflexe, le traiter directement:
			else vcode2=vcode;
			// Obtenir la lettre:
			BYTE lettre=LOBYTE(vcode2);
			// Obtenir l'état des touches SHIFT,CTRL et ALT pour le caractère courant:
			BYTE etat=HIBYTE(vcode2);
			// Simuler l'appui sur la touche SHIFT pour les lettres majuscules:
			if(etat==1) keybd_event(VK_SHIFT,0,0,255);
			// Simuler l'appui sur la touche Alt Gr pour certains caractères:
			if(etat==6) 
			{
				keybd_event(VK_CONTROL,0,0,255);
				keybd_event(VK_MENU,0,0,255);
			}
			// Simuler l'appui de la touche correspondant au caractère courant:
			keybd_event(lettre,0,0,255);
			keybd_event(lettre,0,KEYEVENTF_KEYUP,255);
			// Simuler relachement dela touche SHIFT pour les lettres majuscules:
			if(etat==1) keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,255);
			// Simuler relachement de la touche Alt Gr pour certains caractères:
			if(etat==6) 
			{
				keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,255);
				keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,255);
			}
			// Incrémenter notre indicateur de position dans la chaine à afficher:
			position++;
			// Si la fin de chaine est atteinte, mettre à 0 l'indicateur de position:
			if(position==lstrlen(texte)) position=0;
			// Sauter les autres hooks:
			return 1;
		}
	}
	// Renvoi des messages au sytème pour permettre d'autres hooks
	return CallNextHookEx(hHook, nCode, wParam, lParam);
}
/********************************************************************************************/

/*********************************** Fonction WinMain ***************************************/
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmd, int show)
{
	// Créer le timer de chronométrage:
	UINT_PTR timer=SetTimer(0,0,180000,0);// 3 minutes
	// Lancer le hook clavier:
	hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC) HookProc, hinst, 0);
	// Boucle des messages:
	MSG msg;
	while (GetMessage(&msg, 0, 0, 0)) 
	{
		// Sortir de la boucle des messages si les 3 minutes sont écoulées:
		if(msg.message==WM_TIMER && msg.wParam==timer) break;
	}
	// Arrêter le hook clavier:
	UnhookWindowsHookEx(hHook);
	// Détruire le timer:
	KillTimer(0,timer);
	// Quitter:
	return 0;
}
/*********************************************************************************************/


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture SOUS-CLASSEMENT DE FENÊTRE D'UN AUTRE PROCESS PAR INJECTION ...
Source avec Zip Source avec une capture FENÊTRE FLOTTANTE SANS FOCUS (WIN32 API)
Source avec Zip Source avec une capture SERVICE WINDOWS DANS UNE DLL LANCÉ PAR SVCHOST.EXE
Source avec Zip Source avec une capture IMPRESSION EN WIN32 API AVEC OPTIONS
Source avec Zip Source avec une capture INFOTIP SHELL EXTENSION (BULLE DE L'EXPLORATEUR WINDOWS) (WI...

 Sources de la même categorie

Source avec Zip SCHEDULER RR FIFO par yvesB87
Source avec Zip ALGORITHMES RÉCURSIFS VS ALGORITHMES ITÉRATIFS par yvesB87
Source avec Zip Source avec une capture C++ FORMAT D'IMAGE AVEC QT par pop70
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
Source avec Zip Source avec une capture [C++] CLASS REGISTER par Miwik

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MOUSECONTROL par NeoUmbrella
Source avec Zip BEEPER, UTILISER UN HOOK CLAVIER INTÉGRÉ À L'EXÉCUTABLE ET G... par ndubien
Source avec Zip Source avec une capture HOOK CLAVIER AVEC DLL EN C++ [DEV-C++] par victorcoasne
Source avec Zip Source avec une capture KEYLOGGER HOOK CLAVIER (SANS DLL) par kerneltony95
Source avec Zip SIMULER LES TOUCHES CLAVIER par BruNews

Commentaires et avis

Commentaire de SAKingdom le 06/09/2007 19:58:37

if(position==lstrlen(texte))

Étant donné que texte est un tableau et que son contenue ne change pas, ne serait t-il pas mieux de faire un sizeof ?

if(position == (sizeof(texte)-1))

Commentaire de racpp le 07/09/2007 02:47:15 administrateur CS

Oui effectivement c'est mieux. Pendant les tests, je récupérais du texte depuis un Edit pour vérifier le fonctionnement avec les différents accents et le tréma. Ca m'a pris tellement de temps que j'ai totalement oublié que je n'ai plus besoin de lstrlen().
Merci pour la remarque.

Commentaire de kiki67100 le 24/09/2007 18:10:08

Le code et super merci

++

Kevin

Commentaire de magic_Nono le 24/10/2007 19:40:06

simple, clair et abondamment commenté,

très bonne source.

Commentaire de magic_Nono le 24/10/2007 19:42:23 10/10

la note ^^

Commentaire de dahaka91 le 03/11/2007 13:01:09

en effet source très claire grâce aux nombreux commentaires.
cependant en éxécutant le fichier d'origine tout marche bien alors que lorsque je compile la source cela fonctionne bien mis à part que j'obtiens une fenêtre dos :/
une idée ?

Commentaire de dodobird14 le 07/01/2009 10:45:36 10/10

Merci pour le code, très clair

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

simuler la frappe clavier [ par xbabilone ] Salut a tous .je cherche a similer la frappe d'une touche au clavier .Avec une fonction aussi simple  que GetAsyncKeyState().Quel fonction utiliser?Me simuler une frappe de touche [ par kirby94460 ] Salut j'aimerai savoir comment simuler une frappe de clavier ;je m'explique :le bouton entree sera taper tout seul (par aucun utilisateur) par exemple Hook clavier [ par victorcoasne ] Bonjour, J'ai un pavé numérique USB mais quand je tape dessus il me met les caractères du haut du clavier : 1 c'est &; 2 c'est é; 3 c'est " ... Pour Détourner la copie de windows par un hook [ par alphaone ] Bonjour, je sais qu'il est possible de détourner la copie de windows pour copier avec sont logiciel et non pas avec la copie de windows, mais je suis Hook clavier & souris [ par sm777 ] Bonjour, J'aimerais implémenter un hook clavier/souris. Je me suis inspirée de l'exemple 'inactivité' dans les tuto mais j'ai des soucis car je pens Hook clavier C++ (ou Java) [ par xmaple ] Bonjour, Voici mon problème, je souhaiterai faire un programme sous windows que je lancerai sur une invite de commande et qui détecterai les touches d Simuler mon clavier a partir de mon site web [ par supergrey ] Salut, je voudrais savoir comment faire pour simuler des appuis sur les touches de mon clavier a partir d'une page html sur&nbsp;mon site web.Je sais simulation frappe clavier [ par prog0 ] Bonjour,Je voudrais faire un programme en C qui, dans un 1er temps,&nbsp;ouvre une&nbsp;invite de command MS-DOS et dans un second temps simule les fr Quels sont les paramètres d'un Hook clavier [ par LaPatoshe ] bonjour et meilleurs voeux.Je viens de cr&#233;er une DLL contenant un hook interceptant les messages du clavier (WH_KEYBOARD). Losrque l'utilisateur Hook clavier sous windows [ par gamani5 ] sltje sais il y a deja beaucoup de tuto sur le sujet mais j en ai lu plein mais j ai toujours un probleme, j arrive a detecter l utilisation d une tou


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 2,402 sec (3)

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