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

Delphi Discussion :

getasynckeystate->keybd_event, pourquoi si instable ?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Par défaut getasynckeystate->keybd_event, pourquoi si instable ?
    Bonsoir, débutant en delphi, j'aurai aimé faire une application pouvant simuler la préssion de Espace par préssion de AltGr.

    tout d'abord voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin
         If (GetASyncKeyState(VK_RMENU) <> 0)
    Then   keybd_event(VK_SPACE,0,0,0); //Préssion
      keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0); //Relachement
    end;
    et donc, sa marche éxtrémement mal, ai-je eu une vision trop utopique du résultat que ce code aurai du produire ?

    Ps: meme probleme avec sendinput, le souci viendrai de getasynckeystate ?

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    begin
         If (GetASyncKeyState(VK_RMENU) <> 0) Then
    le souci viendrai de getasynckeystate ?
    Dommage que ton code ne montre pas ce qu'il y a juste devant le begin.

    Essayes donc de placer ton if dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    procédure Form1.Timer1Timer(Sender: TObject);
    begin      If (GetASyncKeyState(VK_RMENU) <> 0) Then ....
    .. cela devrait marcher entre un peu mieux et mieux selon la valeur affectée à la propriété Interval du Timer (à ajuster par tâtonnements);
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    J'ignore si ton extrait de code était complet, mais il manquait les begin end, ta lenteur ne serait pas de ce faite ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    begin
         If (GetASyncKeyState(VK_RMENU) <> 0) then
         begin // il manquait ça non ?
           keybd_event(VK_SPACE,0,0,0); //Préssion
           keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0); //Relachement
         end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Par défaut
    Rebonjour !!
    Le begin aprés un IF semble ne rien changer.

    Cenpendant j'ai bien trouver ce qui posait probleme, un souci au niveau de mon timer.interval

    Mais j'ai toujours un autre souci, car sa ne fonctionne toujours pas dans mon application directx, alors que sa fonctionne partout ailleur :S.

    Get a synckeystate n'était-il pas sencé fonctionner en "bas niveau" ?

    est-il plus intéréssant d'utiliser des procédures se présentant sous la forme de keyup et de keydown et d'y insérrer chaque parties correspondante de mon sendinput et d'appeler ces procédures selon l'état de la touche ?


    Egalement, j'aimerai savoir pourquoi RMENU fonctionne éxtrémement mal ?!
    Car une vkey tel que shift ou autre réponds trés bien, or RMENU ne réagit quasiment jamais lors de sa préssion.....

    j'ai éssayé avec quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;
     
     
    type
      TForm1 = class(TForm)
         Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState) ;
        procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState) ;
    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
     
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin if Key = VK_SHIFT then
      begin
      Input.Itype := INPUT_KEYBOARD;
      Input.ki.wVk := VK_SPACE;
      Input.ki.wScan := 0;
      Input.ki.time := 0;
      Input.ki.dwExtraInfo := 0;
      Input.ki.dwFlags := 0;    // Preparation pour envoi Key DOWN
      SendInput(1, Input, SizeOf(Input));  //Send Key DOWN
      end;
    end;
     
    procedure TForm1.FormKeyup(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin if Key = VK_SHIFT then
      begin
      Input.Itype := INPUT_KEYBOARD;
      Input.ki.wVk := VK_SPACE;
      Input.ki.wScan := 0;
      Input.ki.time := 0;
      Input.ki.dwExtraInfo := 0;
      Input.ki.dwFlags := KEYEVENTF_KEYUP; // preparation pour envoi Key UP
      SendInput(1, Input, SizeOf(Input)); //Send Key UP
      end;
    Mais bien évidement sa ne marche pas
    ps: j'ai remis shift en vkey en attendant de comprendre pourquoi altgr marche trés mal lors de sa préssion.

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    J'ai un doute que VK_RMENU soit le AltGr.

    Alt GR est la combinaison de Alt + Ctrl (fait le teste pour faire un | tu verras que faire [Alt GR + 6] ou [Ctrl + Alt + 6] ca donne la même chose)

    Pour moi si je me souviens bien, VK_RMENU c'est pas la touche windows ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Citation Envoyé par Malatar
    Pour moi si je me souviens bien, VK_RMENU c'est pas la touche windows ?
    Les codes touche virtuelle pour les touches Windows sont VK_[L|R]WIN.

    Mais d'accord avec toi: Alt-Gr correspond bien à la combinaison de Alt + Ctrl.

    @+

Discussions similaires

  1. [Templates] Quel système utilisez-vous ? Pourquoi ?
    Par narmataru dans le forum Bibliothèques et frameworks
    Réponses: 270
    Dernier message: 26/03/2011, 00h15
  2. Que choisir ? C# , VB.NET, C++, Delphi ? pourquoi ?
    Par Louis-Guillaume Morand dans le forum Général Dotnet
    Réponses: 475
    Dernier message: 08/04/2010, 19h27
  3. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  4. Pourquoi ces directives #ifndef ... en haut des .h
    Par Patrick PETIT dans le forum C
    Réponses: 8
    Dernier message: 06/03/2003, 23h53

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