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

Lazarus Pascal Discussion :

Piloter une application tierce : une bizarrerie que je ne m'explique pas [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2015
    Messages : 23
    Points : 34
    Points
    34
    Par défaut Piloter une application tierce : une bizarrerie que je ne m'explique pas
    Bonjour à tous,
    le sujet à déjà été abordé et avant de poster j'ai lu ces posts relatifs à la question. Peut-être suis-je passé à côté de l'un d'eux.
    Voici mon souci : je souhaite piloter une application tierce(simulateur de vol) à partir d'un autre programme. Pour cela je dois simuler l'appuie de touches dans l'application tierce.
    Voici le source de l'unité qui est censé faire cela :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    unit u_scancode;
     
    {$mode objfpc}{$H+}
     
    interface
     
     
    procedure SendKeyPress(FScanCode, FCombinaison: integer; FAppli: string);
     
    implementation
     
    uses
      Windows, Forms;
     
    procedure SendKeyPress(FScanCode, FCombinaison: integer; FAppli: string);
    var
      whandle: hwnd;
      FVk_Code: integer;
    begin
      FVk_Code := MapVirtualKey(FScanCode, MAPVK_VSC_TO_VK); // conversion du scancode en Vk_Code correspondant;
      if Fvk_Code = 0 then
        Fvk_Code := 51;
      wHandle := findWindow(nil, 'Falcon BMS');
      SetForeGroundWindow(whandle);
      case Fcombinaison of
        0:
        begin // touche seule
          keybd_event(FVk_Code, FScanCode, 0, 0);// touche pressée
          keybd_event(FVk_Code, FScanCode, KEYEVENTF_KEYUP, 0);//Touche relevée
        end;
        1:
        begin // touche SHIFT
          keybd_event(VK_SHIFT, 42, 0, 0);
          keybd_event(FVk_Code, FScanCode, 0, 0);
          keybd_event(FVk_Code, FScanCode, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_SHIFT, 42, KEYEVENTF_KEYUP, 0);
        end;
        2:
        begin // touche CTRL
          keybd_event(VK_CONTROL, 29, 0, 0);
          keybd_event(FVk_Code, FScanCode, 0, 0);
          keybd_event(FVk_Code, FScanCode, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_CONTROL, 29, KEYEVENTF_KEYUP, 0);
        end;
        3:
        begin // touche SHIFT + CTRL
          keybd_event(VK_SHIFT, 42, 0, 0);
          SetForeGroundWindow(whandle);
          keybd_event(VK_CONTROL, 29, 0, 0);
          keybd_event(FVk_Code, FScanCode, 0, 0);
          keybd_event(FVk_Code, FScanCode, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_CONTROL, 29, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_SHIFT, 42, 0, 0);
        end;
        4:
        begin // touche ALT
          keybd_event(MapVirtualKey(56, MAPVK_VSC_TO_VK), 56, 0, 0); //ALT
          keybd_event(FVk_Code, FScanCode, 0, 0);
          keybd_event(FVk_Code, FScanCode, KEYEVENTF_KEYUP, 0);
          keybd_event(MapVirtualKey(56, MAPVK_VSC_TO_VK), 56, KEYEVENTF_KEYUP, 0);
        end;
        5:
        begin // touche SHIFT + ALT
          keybd_event(VK_SHIFT, 42, 0, 0);
          keybd_event(VK_LMENU, 56, 0, 0); //ALT
          keybd_event(FVk_Code, FScanCode, 0, 0);
          keybd_event(FVk_Code, FScanCode, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_LMENU, 56, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_SHIFT, 42, KEYEVENTF_KEYUP, 0);
        end;
        6:
        begin // touche CTRL + ALT
          keybd_event(VK_CONTROL, 29, 0, 0);
          keybd_event(VK_LMENU, 56, 0, 0); //ALT
          keybd_event(FVk_Code, FScanCode, 0, 0);
          keybd_event(FVk_Code, FScanCode, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_LMENU, 56, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_CONTROL, 29, KEYEVENTF_KEYUP, 0);
        end;
        7:
        begin // touche SHIFT + CONTROL + ALT
          keybd_event(VK_SHIFT, 42, 0, 0);
          keybd_event(VK_CONTROL, 29, 0, 0);
          keybd_event(VK_LMENU, 56, 0, 0); //ALT
          keybd_event(FVk_Code, FScanCode, 0, 0);
          keybd_event(FVk_Code, FScanCode, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_LMENU, 56, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_CONTROL, 29, KEYEVENTF_KEYUP, 0);
          keybd_event(VK_SHIFT, 42, KEYEVENTF_KEYUP, 0);
        end;
      end;
    end;
     
    end.
    A des fins de test, j'ai créé un programme afin de vérifier que le programme commandera bien le programme tiers (le simulateur de vol falcon BMS)
    Pour cela j'ai une liste de scancodes et de codes de combinaison de touches, SHIFT, ALT et CTRL associés (voir codage dans le source)
    Nom : Page-000178.png
Affichages : 256
Taille : 8,6 Ko
    La bizarrerie observée :
    1 - quand je double clique sur un item de la listbox du programme test, l'appui de la touche et de la combinaison (SHIFT, ALT, CTRL) est envoyé au programme tiers. Cela est bien vérifié dans le setup de ce dernier mais ... la commande n'est pas prise en compte en cours de vol.
    2 - Quand je clique sur le bouton test qui simule un appuie séquentiel sur toutes les touches de la liste box alors là les commandes sont reconnues en vol.

    Je ne m'explique pas pourquoi. Bien entendu, il faudrait que le programme tiers reconnaisse l'appuie d'une touche et d'une combinaison de touches SHIFT, ALT et CTRL.
    Une idée sur cette différence de fonctionnement observée à partir de la même routine ?

    Ci-joint les sources écrites sous codetyphon.
    Fichiers attachés Fichiers attachés

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Si tu regardes l'aide sur SetForegroundWindow :
    An application cannot force a window to the foreground while the user is working with another window. Instead, Windows flashes the taskbar button of the window to notify the user.
    Pas sûr donc que le simulateur reçoive effectivement les commandes. Elles seront plutôt consommées par ta propre fenêtre qui est toujours au premier plan.

    A la place, fait que la fenêtre de commandes ne soit jamais activée (même si tu cliques dessus). Il faut pour cela modifier ses paramètres de création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type
      TForm1 = class(TForm)
      protected
        Procedure CreateParams(var Params: TCreateParams); override;
      end;
     
    procedure TForm1.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      Params.exstyle := Params.exstyle or WS_EX_NOACTIVATE or WS_EX_TOPMOST;
    end;
    Un deuxième point pouvant poser problème est qu'un jeu lit en général l'état de la touche lorsqu'il en a besoin, il ne réagit pas aux messages (même s'il vide la pile). Conserver les touches pressées plus longtemps peut être nécessaire (Sleep entre Down et Up).

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2015
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Cela fonctionne en créant la procédure createparams indiquée.
    Un grand merci à toi

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

Discussions similaires

  1. ouvrir une application dans une application
    Par lolodev dans le forum Android
    Réponses: 0
    Dernier message: 21/10/2011, 08h57
  2. Réponses: 0
    Dernier message: 20/09/2011, 17h23
  3. Passer d'une application Java à une application web
    Par freddy000 dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 02/01/2011, 14h57
  4. Réponses: 7
    Dernier message: 06/11/2008, 16h38
  5. [Joomla!] passer d'une application locale à une application web sur Joomla
    Par Gabrieel dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 15/05/2008, 18h38

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