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

Langage Delphi Discussion :

Problème avec send message et WM_CHAR


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut Problème avec send message et WM_CHAR
    Salut a tous, j'essaye vainement d'envoyer un caractère à l'application en cours, le problème est que ca ne fonctionne pas.

    je fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SendMessage(main,WM_CHAR,ord('k'),0);// envoi d'un caractère : ca marche pas.
          PostMessage(main,WM_CHAR,ord('k'),0);// envoi d'un caractère : ca marche pas.
    ou main est de type HWND.

    ce code ne fonctionne pas alors que quand j'envoye le message de fermeture ca fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage(main,WM_CLOSE,0,0);
    Es-ce que quelqu'un pourrait me donner une indication ou me dire pourquoi ca ne fonctionne pas? merci.

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut


    comment fait tu pour trapper le message afin de savoir qu'il ne marche pas ??

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut
    salut, en fait, la variable main, de type HWND correspond à la fenetre qui a la main, je veux donc, par exemple, si je met le bloc note en premier plan, que le caractère 'k' s'affiche ... Comme il ne s'affiche pas, c'est que ca ne marche pas ..lol, voila le code un peu plus complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    messageKey := Athread.Connection.ReadLn;
      main := getForegroundWindow();
      if getForegroundWindow() = main then   //on test si il n'y a pas eu de changement
             PostMessage(main,WM_CHAR,ord('k'),0);// envoi d'un caractère : ca marche pas.

  4. #4
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    A priori, le format est KO: (au moins sur lParam)
    WM_CHAR
    nVKey = wParam; /* virtual-key code */
    dwKeyData = (DWORD) lParam; /* key data */
    The WM_CHAR message is sent when a WM_KEYUP message and a WM_KEYDOWN message are translated. The WM_CHAR message contains the value of the key being pressed or released.
    Parameter Description
    nVKey Value of wParam. Specifies the virtual-key code value of the key.
    dwKeyData Value of lParam. Specifies the repeat count, scan code, extended key, context code, previous key state, and key-transition state, as shown in the following table:
    Bit Description
    0-15 Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user holding down the key.
    16-23 Specifies the scan code. The value depends on the original equipment manufacturer (OEM).
    24 Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if it is an extended key; otherwise, it is 0.
    25-26 Not used.
    27-28 Used internally by Windows.
    29 Specifies the context code. The value is 1 if the ALT key is held down while the key is pressed; otherwise, the value is 0.
    30 Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.
    31 Specifies the key-transition state. The value is 1 if the key is being released, or it is 0 if the key is being pressed.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut
    merci gi130, pourrais-tu me donner le lien où tu as eu ces infos?

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    F1 ou aide de delphi

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Si j'ai bien compris GetForegroundWindow() renvoi le handle de la fenêtre ayant le focus.

    Vous désirez écrire dans cette fenêtre sur le composant ayant le focus (ActiveControl). Je pense que le handle a utiliser pour le message est celuis du composant devant recevoir le message.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut
    en fait, la fenetre qui a le focus est notepad, et je veux envoyer un caractère à notepad

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Salut, il n'y a pas si longntemps, j'ai posté ceci qui devrait t'aider :

    Salut,
    Ce qu'il faut savoir c'est que l'on envoie pas des "codes" touches à une fenètre en particulier, mais à Windows, qui le relaye ensuite à la fenêtre qui à le focus.

    Donc, selon moi, voici la démarche à suivre :
    1 - Mettre le focus sur la fenètre (ou le contrôle fenétré qui doit recevoir la saisie clavier.
    2 - envoyer le code touche à Windows

    Celà ce traduit par ce code :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     //Procedures pour simuler l'appui de touches -DEBUT
     procedure SimulateKeyDown(Key : byte);
     begin
       keybd_event(Key, 0, 0, 0);
     end;
     
     procedure SimulateKeyUp(Key : byte);
     begin
       keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
     end;
     
     procedure SimulateKeystroke(Key : byte; extra : DWORD);
     begin
       keybd_event(Key, extra, 0, 0);
       keybd_event(Key, extra, KEYEVENTF_KEYUP, 0);
     end;
     
     procedure SendKeys(s : string);
     var i : integer;
         flag : bool;
         w : word;
     begin
       flag := not GetKeyState(VK_CAPITAL)=1;
       if flag then SimulateKeystroke(VK_CAPITAL, 0);
       for i :=1 to Length(s) do
       begin w := VkKeyScan(s[i]);
       if ((HiByte(w) <> $FF) and (LoByte(w) <> $FF))
       then begin
           if HiByte(w)=1
           then SimulateKeyDown(VK_SHIFT);
           SimulateKeystroke(LoByte(w), 0);
           if HiByte(w)=1
           then SimulateKeyUp(VK_SHIFT);
         end;
       end;
       if flag then SimulateKeystroke(VK_CAPITAL, 0);
     end;
     //Procedures pour simuler l'appui de touches -FIN
     
     begin
       //1- Met le Focus "clavier" sur la fenètre spécifiée
       SetFocus(UnHandleDeFenetrte);
     
       //2 - Envoi des codes touches
       SendKeys('Coucou');
       SimulateKeystroke(VK_RETURN, 0);
     end;
    Testé et approuvé par Waskol
    Bon dev
    Bidouilleuse Delphi

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut
    je te remercie, je vais essayer ca et je tiend au courrant, merci encore

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut
    j'ai opté pour la réponse de waskol, mais évidemment, je l'ai remis à ma sauce selon mes besoins (pour ne pas recopier betement un code) merci encore a tous.

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

Discussions similaires

  1. Problème avec le message Update_command_ui
    Par Hepm dans le forum MFC
    Réponses: 2
    Dernier message: 07/11/2007, 10h05
  2. Problème avec les messages (ActionMessage(s))
    Par _Mac_ dans le forum Struts 1
    Réponses: 7
    Dernier message: 07/02/2007, 14h37
  3. Réponses: 19
    Dernier message: 21/11/2006, 11h57
  4. [Debutant] problèmes avec send()
    Par soulr3av3r dans le forum Réseau
    Réponses: 3
    Dernier message: 14/11/2006, 23h44
  5. Problème avec un message d'erreur
    Par L'Oracle dans le forum Access
    Réponses: 4
    Dernier message: 08/04/2006, 11h11

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