Récupérer des entrées clavier hors d'une fenêtre Win21

Taranael Messages postés 54 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 21 juin 2007 - 6 avril 2005 à 18:17
Taranael Messages postés 54 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 21 juin 2007 - 7 avril 2005 à 09:25
Salut ! Bon j'ai un problème pour un p'tit programme idiot que j'ai fait, c'est un piano tout con en C qui joue de la musique avec votre tourelle quand on appuie sur les touches du clavier ( en gros c'est un switch et un getch dans un while , rien de bien extra-ordinaire). Maintenant je voudrais que mon programme puisse lire les touches enfoncée du clavier même en dehors de la fenêtre du programme ! Mon prof m'a conseillé de me renseigner sur SDL, ce que j'ai fait mais le problème reste le même : quand on sort de la fenêtre il s'occupe plus de ce que je fais avec mon clavier !
Si quelqu'un a une idée à me proposer :)
( PS : à terme mon but serait de faire disparaitre cette fenêtre pour n'avoir qu'une icône dans la barre à côté de l'horloge , comme MSN quoi)

Merci d'avance ;)


L'ordinateur fait toujours ce qu'on lui demande !
Le problème c'est qu'il ne comprend pas ce qu'on lui demande ...

4 réponses

Lord_Patoche Messages postés 196 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 1 mai 2009 3
6 avril 2005 à 22:51
salut. Alors voila le soucis. Windows est un systeme d'exploitation dans lequel plusieurs programmes peuvent être lancés. chacun de ces programme appelé processus occupe un espace mémoire virtuel alloué par Windows. il est impossible à un programme exe situé dans un espace mémoire intervienne dans un espace mémoire d'un autre programme exe directement. c'est une sécurité de windows. La seule façon de le faire, c'est d'utiliser une procédure de Hook. Il s'agit d'une DLL chargée en mémoire au moyen d'un programme de lancement, DLL qui va détourner des évènements Windows des autrs processus. notre DLL pourra gérer ces évènements dfférement avant de les renvoyer à leur processus initial.
J'ai fait un petit programme de hook pour espionner ce qui est tapé sur ma bécane, je vais le mettre en source, mais je dois le pauffiner un peu. dès qu'il est prêt je te l'envoie.
PS : on utilise une DLL, car c'est le seul programme qui sous Windows peut accéder à des processus différents de celui qui l'a lancé.

LaPatoshe
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 avril 2005 à 00:05
Quelques exemples de hook:
HOOK SYSTEM SUR WM_MOUSEWHEEL (WIN32)
http://www.cppfrance.com/code.aspx?ID=25998
DLL HOOK EN RESSOURCE BINAIRE DU PROG (WIN32)
http://www.cppfrance.com/code.aspx?id=25450
HOOK F11 SUR IE (WIN32)
http://www.cppfrance.com/code.aspx?id=18202
HOOK CLAVIER
http://www.cppfrance.com/code.aspx?id=17818
LIMITE LE NBR DE FENETRES IE V2 (WIN32)
http://www.cppfrance.com/code.aspx?id=17387
NO TASK MANAGER (WIN32)
http://www.cppfrance.com/code.aspx?id=11186
HOOK DE ENTER SUR DIALOGBOX (WIN32)
http://www.cppfrance.com/code.aspx?id=11007
HOOK SUR FENETRE (WIN32)
http://www.cppfrance.com/code.aspx?id=10997
AJOUTER UN MENU A NOTEPAD (WIN32)
http://www.cppfrance.com/code.aspx?ID=28181

ciao...
BruNews, MVP VC++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
7 avril 2005 à 04:24
Salut,

Voici un petit programme sans fenêtre qui joue des notes quand on
tape les touches AZERTYUI du clavier quelque soit l'application active.
Il utilise le petit haut-parleur de l'unité centrale. Il s'agit d'un
hook clavier. Pour arrêter le programme et le hook, tu tapes F12.

#define _WIN32_WINNT 0x0400

#include <windows.h>

HHOOK hHook;

DWORD notes[8]={523,587,659,698,784,880,987,1046};

LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam, LPARAM lParam)

{

if ((nCode HC_ACTION) && (wParam WM_KEYDOWN))

{

KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam);

if (hookstruct.vkCode==VK_F12) PostQuitMessage(0);

DWORD scan=hookstruct.scanCode;

if (scan>15 && scan<24) Beep(notes[scan-16],100);

}

return CallNextHookEx(hHook, nCode, wParam, lParam);

}



int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd,int nShow )

{

hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC) HookProc, hInstance, 0);

MSG Msg;

while( GetMessage(&Msg, 0, 0, 0))

{

TranslateMessage( &Msg );

}

UnhookWindowsHookEx(hHook);

return 0;

}

Ca fonctionne sur Windows 2000 ou XP. A toi de le perfectionner. J'espère qu'il te sera utile.
0
Taranael Messages postés 54 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 21 juin 2007 1
7 avril 2005 à 09:25
OKay merci tout le monde je vais étudier cette piste là donc :)
Je sens que je vais me manger une bonne migraine moi pour mes vacances :D
Je posterais mon prog quand je l'aurais fini ;)
Ah et juste j'ai l'air idiot ,c'est bien sur une faute de frappe dans le titre , je parle de Win32 et pas Win21 :)


L'ordinateur fait toujours ce qu'on lui demande !
Le problème c'est qu'il ne comprend pas ce qu'on lui demande ...
0
Rejoignez-nous