SDL_Event en dehors de la fenêtre
Résolu
Utilisateur anonyme
-
Sugel Messages postés 4076 Date d'inscription Statut Membre Dernière intervention -
Sugel Messages postés 4076 Date d'inscription Statut Membre Dernière intervention -
Bonsoir,
Voici mon code :
Voici la théorie de mon programme :
- Déclancher un chronomètre à l'appui d'une touche
- Arrêter le chronomètre à un nouvel appui d'une touche
- Enregistrer le résultat dans un fichier .txt
Cependant, voici mon problème (le code ci-dessus sert à tester l'événement de l'appui d'une touche) :
Lorsque j'appuie sur une touche, le progamme se ferme, tout fonctionne bien, mais lorsque j'appuie sur une touche en n'étant pas sur la fenêtre en question, alors plus rien ne se passe... Le programme ne se ferme pas si on n'est pas "focus" sur la fenêtre.
Comment pourrais-je faire pour que l'appui soit prit en compte même si on n'est pas "focus" sur la fenêtre ?
Merci d'avance.
EDIT : Ou alors SDL n'est-il pas le bon moyen pour faire cela...?
<\EchoIsON>
Voici mon code :
int main(int argc, char *argv[]) { SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode(400, 300, 32, SDL_HWSURFACE | SDL_RESIZABLE); SDL_Event event; while(continuer) { SDL_WaitEvent(&event); switch(event.type) { case SDL_KEYDOWN: continuer = 0; break; } } SDL_Quit(); return EXIT_SUCCESS; }
Voici la théorie de mon programme :
- Déclancher un chronomètre à l'appui d'une touche
- Arrêter le chronomètre à un nouvel appui d'une touche
- Enregistrer le résultat dans un fichier .txt
Cependant, voici mon problème (le code ci-dessus sert à tester l'événement de l'appui d'une touche) :
Lorsque j'appuie sur une touche, le progamme se ferme, tout fonctionne bien, mais lorsque j'appuie sur une touche en n'étant pas sur la fenêtre en question, alors plus rien ne se passe... Le programme ne se ferme pas si on n'est pas "focus" sur la fenêtre.
Comment pourrais-je faire pour que l'appui soit prit en compte même si on n'est pas "focus" sur la fenêtre ?
Merci d'avance.
EDIT : Ou alors SDL n'est-il pas le bon moyen pour faire cela...?
<\EchoIsON>
A voir également:
- SDL_Event en dehors de la fenêtre
- Fenêtre en dehors de l'écran - Guide
- Fenetre windows - Guide
- Fenetre de navigation privée - Guide
- Mcafee fenetre intempestive - Accueil - Piratage
- La fenetre actuelle est trop petite pour afficher correctement cette feuille - Forum Google Docs
1 réponse
Salut !
Tu peux pas faire ça avec la SDL, c'est l'OS qui gère la répartition des inputs aux applications (sous windows, sous linux ça marche pas exactement comme ça).
Tu peux utiliser cette fonction de l'API windows pour capturer les frappes clavier de tout le système:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowshookexa?redirectedfrom=MSDN
un type a fait ça bien en C# ici:
https://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook
La même en C :
https://www.unknowncheats.me/forum/c-and-c/83707-setwindowshookex-example.html
Réécrit sans cancer, ça donne :
Avant d'écrire un message, pensez que nous sommes là par passion, et par espoir de vous la communiquer: Si c'est pas génial, ça !
Tu peux pas faire ça avec la SDL, c'est l'OS qui gère la répartition des inputs aux applications (sous windows, sous linux ça marche pas exactement comme ça).
Tu peux utiliser cette fonction de l'API windows pour capturer les frappes clavier de tout le système:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowshookexa?redirectedfrom=MSDN
un type a fait ça bien en C# ici:
https://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook
La même en C :
https://www.unknowncheats.me/forum/c-and-c/83707-setwindowshookex-example.html
Réécrit sans cancer, ça donne :
#include <Windows.h> HHOOK _hook; LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode >= 0 && wParam == WM_KEYDOWN) { KBDLLHOOKSTRUCT kbdStruct = *((KBDLLHOOKSTRUCT*)lParam); if (kbdStruct.vkCode == VK_F1) puts("F1 is pressed!"); } return CallNextHookEx(_hook, nCode, wParam, lParam); } void SetHook() { if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0))) FAIL("Failed to install keyboard hook!"); }
Avant d'écrire un message, pensez que nous sommes là par passion, et par espoir de vous la communiquer: Si c'est pas génial, ça !
J'ai vu sur d'autres forums la fonction GetKeyState de l'API Windows, est-ce-qu'elle permet de faire la même chose ?
Ça permet de check l'état d'une touche, oui, mais pas d'avoir un signal quand elle est appuyée.
Tu peux obtenir un truc vaguement équivalent avoir un boucle qui appelle d'API sans arrêt, mais c'est une très mauvaise idée.