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 :

Probleme PostMessage


Sujet :

Windows

  1. #1
    Membre actif Avatar de Mogwaï
    Inscrit en
    Mai 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 247
    Points : 278
    Points
    278
    Par défaut Probleme PostMessage
    Bonjour,

    Je souhaite simuler l'écriture de caractères du clavier.

    Pour ce faire j'ai suivi le turoriel décrit ici.

    Le focus sur la fenetre désirée se fait bien, mais impossible d'envoyer un seul caractère.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <windows.h>
     int main&#40;int argc, char * argv&#91;&#93;&#41;
    &#123;
         HWND hMPlayer = FindWindow&#40;"IEFrame",NULL&#41;;
         SetForegroundWindow&#40;hMPlayer&#41;;
         Sleep&#40;100&#41;;
         PostMessage&#40;hMPlayer,WM_KEYDOWN,VK_SPACE,0&#41;;
         Sleep&#40;5000&#41;;
         PostMessage&#40;hMPlayer,WM_KEYUP,VK_SPACE,0&#41;;
         return 0;
    &#125;
    Les scripts qui gèrent la souris quant à eux fonctionnent bien.

    Je plenche dessus depuis des heures, je n'arrive vraiment pas à faire fonctionner l'écriture de caractères....

    Pouvez-vous m'aider ?...
    En vous remerciant

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Salut,

    Je vois deux origines possibles pour ton problème de programmation Windows :
    1) Quand tu restes appuyé sur une touche, WM_KEYDOWN est répété (une partie du paramètre lParam contient un compteur de répétition)
    2) le paramètre lParam ne devrait pas être zéro. Tu devrais regarder du coté de OemKeyScan() et VkKeyScan()...

    PS : "IEFRame" est typiquement une fenêtre d'IE. Pourquoi l'appelles-tu hMPlayer?

  3. #3
    Membre actif Avatar de Mogwaï
    Inscrit en
    Mai 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 247
    Points : 278
    Points
    278
    Par défaut
    En fait j'ai copié collé un code qui est dans le tutoriel et qui est donc censé marcher

    J'ai juste changé le parametre de SetForegroundWindow, ça explique pourquoi le nom de la fenetre correspond pas.

    Tu as l'air de savoir comment utiliser SendMessage correctement.... j'ai passé la soirée hier soir à essayer de trouver un tutoriel compréhensible là dessus, mais je n'ai rien trouvé qui m'aide.

    Peux-tu me donner une ligne valide contenant PostMessage et écrivant le caractère 'A' par exemple dans la fenetre cible ? C'est juste ce que je veux faire : ecrire des caractères dans une fenêtre.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ben, pour commencer, il faut être sur de sélectionner l'editbox elle-même et non pas la fenêtre.
    Ensuite, j'ai le regret de t'informer que tu n'auras aucun contrôle sur la touche SHIFT avec les WM_KEYDOWN/UP : la fonction TranslateMessage() utilisée par l'editbox pour transformer les WM_KEYDOWN/UP en WM_CHAR utilise des données internes (keyboard state) et poster un KEYDOWN avec la touche SHIFT n'a aucun effet...

    En clair, tu peux juste poster des touches, pas des combinaisons... Et inutile d'essayer de truander en postant les WM_CHAR toi-même, ça ne marche pas...

    Donc, y'a que ceci qui marche, pour poster des lettres minuscules (sauf peut-être en simulant un appui sur CapsLock...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void PostVirtualKey&#40;HWND hWnd, UINT vk&#41;
    &#123;
    PostMessage&#40;hWnd, WM_KEYDOWN, vk, MAKELONG&#40; 1,MAKEWORD&#40;MapVirtualKey&#40;vk,0&#41;,0x00&#41; &#41;&#41;;
    PostMessage&#40;hWnd, WM_KEYUP  , vk, MAKELONG&#40; 1,MAKEWORD&#40;MapVirtualKey&#40;vk,0&#41;,0xC0&#41; &#41;&#41;;
    &#125;

  5. #5
    Membre actif Avatar de Mogwaï
    Inscrit en
    Mai 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 247
    Points : 278
    Points
    278
    Par défaut
    En fait je veux pouvoir écrire les lettres a-z; A-Z; 0_9

    Comment utiliser ta fonction pour envoyer un A par exemple ?
    PostVirtualKey(fenetre, ??) ?...

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour envoyer un A (dont tu n'auras aucun moyen de deviner s'il est majuscule ou minuscule), c'est PostVirtualKey(contrôle, 'A'); (le code de virtual-key des touches A à Z, c'est la lettre majuscule correspondante)

    La liste des virtualkey est dans winuser.h.

    Il y a peut-être quelque part un moyen de faire marcher minuscules/majuscules, mais je ne le connais pas...

  7. #7
    Membre actif Avatar de Mogwaï
    Inscrit en
    Mai 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 247
    Points : 278
    Points
    278
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <windows.h> 
     int main&#40;int argc, char * argv&#91;&#93;&#41; 
    &#123; 
         HWND hWnd = FindWindow&#40;"IEFrame",NULL&#41;;
         SetForegroundWindow&#40;hWnd&#41;;
         Sleep&#40;2000&#41;;
         UINT vk = 'A';
         PostMessage&#40;hWnd, WM_KEYDOWN, vk, MAKELONG&#40; 1,MAKEWORD&#40;MapVirtualKey&#40;vk,0&#41;,0x00&#41; &#41;&#41;; 
         PostMessage&#40;hWnd, WM_KEYUP  , vk, MAKELONG&#40; 1,MAKEWORD&#40;MapVirtualKey&#40;vk,0&#41;,0xC0&#41; &#41;&#41;;
         return 0;
    &#125;
    J'en suis désolé mais ça ne marche pas non plus... La page a bien le focus, le curseur est au bon endroit, mais rien ne s'écrit....

    Arrives-tu à le faire fonctionner ?

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Mais tu veux écrire dans quoi?
    - La barre d'adresse ? (peut-être faisable)
    - Une editbox dans la page ? (! ça doit être pratiquement impossible de la trouver)

    Ce n'est sûrement pas dans la fenêtre elle-même que tu écris, mais dans un contrôle (sans doute une editbox) qui se trouve DANS la fenêtre en question! Et il faut trouver le bon...

  9. #9
    Membre actif Avatar de Mogwaï
    Inscrit en
    Mai 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 247
    Points : 278
    Points
    278
    Par défaut
    Dans un champ texte sur lequel il y a dejà le focus, est-ce possible ?...
    Pour exemple, une page google, avec le focus sur la boite de recherche, et le programme qui écrit dans cette boite pour faire une recherche (c'est un exemple), sachant que le focus est déjà sur cette input.

    Est-ce faisable ?
    J'imagine que oui...

    Ou alors, existe-t-il une autre methode qui permette d'émuler le clavier, quelle que soit la fenetre affichée ?

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu ne peux pas savoir quel contrôle possède le focus s'il n'appartient pas au thread courant. Bref, il faudrait que ce soit IE qui exécute ta fonction pour que ça marche...

    En plus, comment retrouver la bonne editbox dans un programme qui en fabrique et en défait en permanence?

    Donc, désolé, ça doit pas marcher... Par contre, avec la fonction, tu peux poster VK_F5, pour rafraichir la page à intervalles réguliers, si tu veux... (J'ai déjà fait un prog comme ça pour ne pas paumer mes marqueurs "nouveau" sur un forum)

  11. #11
    Membre actif Avatar de Mogwaï
    Inscrit en
    Mai 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 247
    Points : 278
    Points
    278
    Par défaut
    Non mais y'a forcément un moyen de faire ce que je souhaite.

    Si le clavier arrive à envoyer des caractères à windows, un programme peut forcément le faire aussi. Le clavier, lui, il a pas besoin de savoir qui a le focus ou quoi, il envoie juste des caractères. Moi je veux faire pareil : balancer des caractères, c'est tout. Peu importe qui a le focus.

    OK, peut-être qu'avec PostMessage c'est pas faisable, en tout cas pas comme ça. Mais y'a forcément un moyen de le faire, quel que soit le langage ! Je n'ose même pas imaginer que ce soit impossible à réaliser.

    Je vais pas devoir fabriquer un clavier avec un programme dedans quand même ?... ou alors programmer un robot pour qu'il tape sur les touches tout seul ?...

  12. #12
    Membre actif Avatar de Mogwaï
    Inscrit en
    Mai 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 247
    Points : 278
    Points
    278
    Par défaut
    Solution trouvée.

    Langage : C#

    Ligne de code :
    System.Windows.Forms.SendKeys.Send("je suis le texte");

    Je ne voulais rien de plus, rien de moins.

    Merci Médinoc d'avoir pris le temps d'essayer de m'aider.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/05/2008, 11h30
  2. Probleme de handle pour le postmessage
    Par fefay dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2006, 15h26
  3. Probleme avec PostMessage
    Par SPAY dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 01/12/2005, 09h09
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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