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

C++ Discussion :

Message vers une fenêtre qui n'est pas au premier plan


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Par défaut Message vers une fenêtre qui n'est pas au premier plan
    Bonsoir à tous,
    j'ai cherché longuement sur la manière d'envoyer des messages à une fenêtre qui n'est pas au premier plan, et j'ai beaucoup de mal à comprendre pourquoi certains codes marchent et d'autres non:
    Ce code censé simuler l'appui de la combinaison ctrl+P sur une fenêtre dont on a au préalable récupéré le handle, ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         PostMessage(fenetre,WM_KEYDOWN,VK_CONTROL,0);
         PostMessage(fenetre,WM_KEYDOWN,'P',0);
         PostMessage(fenetre,WM_KEYUP,'P',0);
         PostMessage(fenetre,WM_KEYUP,VK_CONTROL,0);
    Pourtant ce code fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         PostMessage(fenetre,WM_KEYDOWN,VK_SPACE,0);
         PostMessage(fenetre,WM_KEYUP,VK_SPACE,0);
    (ce dernier fonctionne sur certains programme, mais pas sur le bloc notes, ce qui est encore plus bizarre...)
    Donc si quelqu'un peut m'éclairer (surtout sur la simulation de combinaison de touches sur une fenêtre qui n'est pas au premier plan),
    je le remercie d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    Ce que vous tentez de faire avec ces appels, c'est de "truander" le programme cible.
    Le programme cible n'est pas obligé de se faire "avoir" par votre "astuce".

    Des programmes utilisant des API comme DirectInput ou autre n'utilisent pas du tout les messages "WM_KEYUP/WM_KEYDOWN", etc...

    C'est quoi votre "vrai" besoin, à part "truander" ces pauvres programmes.

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Ce que je soupçonne c'est que les touches ne sont pas combinées (<- *)

    Parce que le comportement de Windows est

    1) je reçois la touche CTRL (message WM_KEYDOWN) -> j'attends
    2) je reçois la touche P (message WM_KEYDOWN) -> je combine les touches, j'envoie le message CTRL+P (message WM_CHAR)
    3) la fenêtre reçoit le message CTRL+P

    .... et ainsi de suite jusqu'aux messages WM_KEYUP

    Mais en lisant stackoverflow , les messages CTRL+P ne contiennent pas forcément un code CTRL et un code P (<- Windows style)

    Handling keyboard input in win32, WM_CHAR or WM_KEYDOWN/WM_KEYUP? (<- lien stackoverflow en anglais)

    Apparently, windows works in really strange ways. [...] It seems that when you press [shift]+9, windows sends a VK_LEFT in the wParam of message WM_CHAR

    * Édit : parce que la touche espace fonctionne pour un logiciel mais pas CTRL+P qui est la combinaison de 2 touches en 1 message

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    Le "CTRL+P" n'est pas généré par Windows directement. C'est le "TranslateMessage" de votre application qui convertie les WM_KEYDOWN en WM_SYSKEYDOWN/WM_SYSCOMMAND.
    Si votre application n'utilise pas de "TranslateMessage" pas de raccourci, pas de Print.

  5. #5
    Membre confirmé Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Par défaut
    Bonsoir et merci pour ces réponses,
    y a-t-il alors un moyen de simuler l'appui de touches sur une fênetre qui n'a pas le focus (équivalent de la fonction keybd_event pour une fenêtre visée en particulier, sans devoir la mettre au premier plan).
    Sinon Bacelar, je n'ai pas trop compris ta dernière réponse; il faut convertir les WM_KEYDOWN en WM_SYSKEYDOWN/WM_SYSCOMMAND avec la fonction TranslateMessage? Mais comment ? il faudrait créer un objet de type MSG, exécuter la fonction translate dessus? mais comment faire si c'est bien cela qu'il faut faire?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    "keybd_event", c'est aussi une astuce.
    Elle est plus bas niveau, donc plus de programme se font avoir.

    il faut convertir les WM_KEYDOWN en WM_SYSKEYDOWN/WM_SYSCOMMAND avec la fonction TranslateMessage?
    Non, c'est l'application que t'essaye de blouser qui fait son traitement pépère, généralement, en appelant la fonction "TranslateMessage" de Win32 pour convertir les WM_KEYDOWN en WM_CHAR.
    Il suffit que l'application que t'essaye de blouser utilise une méthode de traitement qui ne fonctionne pas avec ton arnaque (comme GetAsyncKeyState https://docs.microsoft.com/en-us/win...tasynckeystate) pour que ta combine ne fonctionne pas.

    C'est quoi votre "vrai" besoin, à part "truander" ces pauvres programmes.
    (BIS)

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/06/2017, 21h40
  2. Tracé d'une ellipse qui n'est pas dans le plan
    Par Petit Taupin dans le forum Mathématiques
    Réponses: 2
    Dernier message: 13/06/2016, 10h45
  3. Impression vers une imrimante qui n'est pas par défaut
    Par abdelghani_k dans le forum Delphi
    Réponses: 5
    Dernier message: 22/05/2007, 12h07
  4. Trouver une valeur qui n'est pas dans un champ
    Par eric41 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/05/2006, 16h48
  5. lien dessus une images qui n'est pas en background
    Par tiyolx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 04/03/2006, 18h40

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