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
    Membre averti
    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
    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 : 297
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 933
    D�tails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    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
    Membre averti
    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
    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. faire d'une application cliente, une application cliente/serveur
    Par grm26 dans le forum G�n�ral Java
    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