IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Récupérer les messages WM_TOUCH avec une message-only window


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Récupérer les messages WM_TOUCH avec une message-only window
    Bonjour,

    Je commence un projet où je dois récupérer les événements touch d'écrans tactiles avec l'API Win32 en C++. Je veux utiliser une fenêtre invisible de type message-only window, mais bien que la fenêtre soit créée et enregistrée correctement elle ne reçoit pas les messages WM_TOUCH. Voici le code de la fonction qui initialise la message-only window et en pièce jointe le main.cpp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    HWND InitMessageOnlyWindow(HINSTANCE hInstance, int nCmdShow) {
        LPWSTR szWindowClassName = TEXT("msgOnly");
    
        WNDCLASSEX windowClass;
        memset(&windowClass, 0, sizeof(windowClass));
        windowClass.cbSize = sizeof(windowClass);
        windowClass.hInstance      = hInstance;
        windowClass.lpfnWndProc    = WndProc;
        windowClass.lpszClassName  = szWindowClassName;
        if(RegisterClassEx(&windowClass)==0) {
            std::cerr << "RegisterClass" << std::endl;
            return 0;
        }
    
        HWND hWindow = CreateWindow(
            szWindowClassName,
            L"",
            0,
            0, 0, 0, 0,
            HWND_MESSAGE,
            NULL, hInstance, NULL);
        if (!hWindow) {
            std::cerr << "CreateWindow" << std::endl;
            return 0;
        }
    
        if(RegisterTouchWindow(hWindow, 0)==0) {
            std::cerr << "RegisterTouchWindow" << std::endl;
            return 0;
        }
    
        return hWindow;
    }
    J'ai testé :
    • la réception des messages WM_INPUT dans la message-only window, c'est OK.
    • la réception des messages WM_TOUCH dans une fenêtre classique, c'est OK.


    Merci d'avance à la personne qui pourra me donner une piste pour comprendre ce problème. Je débute avec l'API Win32 et au-delà de tester d'autres paramètres pour les procédures de création et d'enregistrement je ne vois pas comment trouver où ça coince.

    Marcus
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    L'enregistrement est propre à chaque fenêtre et non pour toute l'application ou tout le système. Elle ne reçoit que les "touchés" qui la concernent. Il n'est d'ailleurs pas possible d'agir en multitouch sur plusieurs fenêtres en même temps puisqu'une seule détient la focalisation.

    WM_INPUT est différent puisqu'il est envoyé à la fenêtre qui le demande après remplissage du buffer clavier/souris au niveau système.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Merci pour votre réponse, est-ce qu'on peut donc dire que les événements touch input et les fenêtres message-only sont incompatibles, au moins dans la situation actuelle ?

    Il me semble néanmoins que cette incompatibilité n'est pas uniquement dû au fait que la fenêtre message-only perd le statut de fenêtre active au premier clic. J'ai essayé à la fois de recevoir les événements Touch Input puis les événements Raw Input (sans l'option RIDEV_INPUTSINK qui permet de les recevoir même si la fenêtre est en background donc inactive). Dans le cas de Touch Input je n'ai jamais reçu le moindre message. Par contre dans le cas de Raw Input tant que je fais des « touchers glissés » et que je ne clique pas, la fenêtre message-only garde le focus et je reçois les événements Raw Input. Peut-être avez-vous une idée sur la façon dont Windows gère et envoie ces deux types de messages ? (je n'ai pas compris le rôle du buffer clavier/souris)

    Pour mon projet je me rabats sur la capture et le traitement des événements Raw Input.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Citation Envoyé par Marcus02 Voir le message
    Merci pour votre réponse, est-ce qu'on peut donc dire que les événements touch input et les fenêtres message-only sont incompatibles, au moins dans la situation actuelle ?
    Totalement.

    Citation Envoyé par Marcus02 Voir le message
    Il me semble néanmoins que cette incompatibilité n'est pas uniquement dû au fait que la fenêtre message-only perd le statut de fenêtre active au premier clic.
    Il y a certainement une incompréhension au niveau des termes: une "fenêtre" Message-Only n'est jamais visible. C'est simplement un objet qui possède un handle, une boucle de messages et qui par conséquent peut être la destination d'un SendMessage. Mais aucun message UI ne lui sera jamais envoyé.

    Citation Envoyé par Marcus02 Voir le message
    J'ai essayé à la fois de recevoir les événements Touch Input puis les événements Raw Input (sans l'option RIDEV_INPUTSINK qui permet de les recevoir même si la fenêtre est en background donc inactive). Dans le cas de Touch Input je n'ai jamais reçu le moindre message.
    Parce que le principe et le but ne sont pas les mêmes.

    Raw Input agit comme un hook de très bas niveau (juste après le remplissage du buffer clavier/souris). Son enregistrement ajoute simplement notre "récepteur" à la chaîne de notification. On est donc averti à chaque ajout au buffer quelques soit la fenêtre (application) active. (je simplifie)

    WM_TOUCH est un événement UI. Son enregistrement annonce à l'OS qu'une fenêtre graphique précise souhaite recevoir les événements tactiles sous la forme multitouch (WM_TOUCH) plutôt que gestuelle (WM_GESTURE).

    Il faut préciser ta pensée

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Oui je commence à comprendre. C'est dommage qu'il n'y ait pas une indication sur cette incompatibilité dans la doc MSDN. À partir du moment où on peut rendre « active » une « fenêtre » message-only et qu'on reçoit les messages correspondants (WM_ACTIVATE, etc), on se met à penser qu'il doit y avoir un moyen d'obtenir les événements Touch Input.

    Merci de m'avoir éclairé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Propriété d'une Message Box avec boutons YesNoCancel
    Par eric4459 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/11/2014, 20h52
  2. Récupérer les mails Outlook dans une table Access
    Par zerrokooll dans le forum VBA Access
    Réponses: 79
    Dernier message: 07/07/2009, 15h22
  3. Gestion des messages envoyés avec une 2ème boite
    Par Cybher dans le forum Outlook
    Réponses: 1
    Dernier message: 09/10/2008, 11h30
  4. [Debutant] envoi d'un message POST avec une URL
    Par Yannos94 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 14/06/2006, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo