SDL_Event en dehors de la fenêtre

Résolu/Fermé
Utilisateur anonyme - Modifié par EchoIsON le 28/06/2016 à 01:00
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 - 28 juin 2016 à 16:11
Bonsoir,

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:

1 réponse

Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
Modifié par Sugel le 28/06/2016 à 01:26
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 :
#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 !
0
Utilisateur anonyme
28 juin 2016 à 15:34
Merci, ce n'est donc pas à faire avec la SDL.
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 ?
0
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
28 juin 2016 à 16:11
ouais mais non.
Ç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.
0