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 :

[Ubuntu] Handle d'une application externe


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Par défaut [Ubuntu] Handle d'une application externe
    Bonjour,
    Mon application Lazarus étant réduite et en "tache de fond", je souhaite obtenir et tracer, à l'aide d'un timer, le handle de l'application ayant le focus.
    J'utilisais jadis getForeGroundWindow avec succès sur le couple WindowsXP/Delphi7.
    Aujourd'hui, sur ubuntu 16.04 x64 et Lazarus 1.6, la fonction getForeGroundWindow me ramène invariablement la valeur 0, indépendamment de l'application ayant réellement le focus.
    Pourquoi tant de haine ?
    Ludo

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 126
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Salut,
    Citation Envoyé par Ludelphi7 Voir le message
    Aujourd'hui, sur ubuntu 16.04 x64 et Lazarus 1.6, la fonction getForeGroundWindow me ramène invariablement la valeur 0, indépendamment de l'application ayant réellement le focus.
    Pourquoi tant de haine ?
    Une piste en Debian 32 bits et Gtk2 : on trouve, dans le dossier d'install de Lazarus (habituellement /usr/share/Lazarus) num_version/lcl/interfaces/gtk2/ dans le fichier gtk2winapi.inc ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function TGtk2WidgetSet.GetForegroundWindow: HWND;
    begin
      Result:=0;
      {$IFDEF HASX}
      Result:=X11GetActiveWindow;
      {$ENDIF}
    end;
    Il faudrait voir si HASX est défini.

    Et X11GetActiveWindow est codé dans gtk2widgetset.inc, au même endroit que l'autre.

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 219
    Par défaut
    hello,
    j'ai le même problème que toi Ludelphi7 (Lubuntu 16.04 64 bits Lazarus 1.8RC3 Gtk2 ) .
    J'ai "débogué" mon programme (je suis arrivé au code de Jipété et j'appelle bien ensuite X11GetActiveWindow) et je pense alors que le problème se trouve dans l'appel de la fonction X : XGetWindowProperty
    Comme je ne suis pas un spécialiste de X11 , j'ai posé le problème dans le forum officiel de Lazarus.
    Pour suivre ce fil de discussion c'est ici

    Ami calmant, J.P (sans T)

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    j'ai le même problème que toi Ludelphi7 (Lubuntu 16.04 64 bits Lazarus 1.8RC3 Gtk2 ) .
    J'ai "débogué" mon programme (je suis arrivé au code de Jipété et j'appelle bien ensuite X11GetActiveWindow) et je pense alors que le problème se trouve dans l'appel de la fonction X : XGetWindowProperty
    Comme je ne suis pas un spécialiste de X11 , j'ai posé le problème dans le forum officiel de Lazarus.
    Pour suivre ce fil de discussion c'est ici

    Ami calmant, J.P (sans T)
    Hi !
    J'ai tenté de suivre le fil et testé le changement de type de variable proposé.
    a) je suis réellement perdu dans X11 -> mon témoignage est sans valeur si j'ai fait mauvaise manip :-(
    b) résultat fixe = 0 !
    Je reste à l'écoute, ludo

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 126
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Citation Envoyé par Ludelphi7 Voir le message
    J'ai tenté de suivre le fil et testé le changement de type de variable proposé.
    En ce qui me concerne, comme ça fonctionnait avant, ça continue à fonctionner après, ouf !

    Mais je rappelle que je suis (encore) en 32 bits !

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 219
    Par défaut
    hello,
    Citation Envoyé par Ludelphi7 Voir le message
    Hi !
    J'ai tenté de suivre le fil et testé le changement de type de variable proposé.
    a) je suis réellement perdu dans X11 -> mon témoignage est sans valeur si j'ai fait mauvaise manip :-(
    b) résultat fixe = 0 !
    Je reste à l'écoute, ludo
    C'est étrange que la modification que j'ai indiquée dans le fil de discussion du forum officiel Lazarus ne fonctionne pas chez toi.
    Voici ce que j'ai modifié dans le fichier gtk2widgetSet.inc (qui est chez moi en /usr/share/lazarus/1.8.0RC3/lcl/interfaces/gtk2 ) :
    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
    function TGtk2WidgetSet.X11GetActiveWindow: HWND;
    var
      Display: PDisplay;
      RootWin, ResultWindow: TWindow;
      WMAtom: TAtom;
      ActualTypeReturn: TAtom;
       format_ret: integer;
      nitems_ret: culong;
      bytes_after_ret: culong;
      prop: Pcuchar;
    //  ActualFormatReturn: LongInt;
    //  NItemsReturn, BytesAfterReturn: Cardinal;
    //  Ptr: PByte;
      ActualFormatReturn: integer;
      NItemsReturn, BytesAfterReturn: culong;
      Ptr: Pcuchar;
      Valid: Boolean;
    begin
      Result := 0;
     
      Display := gdk_x11_get_default_xdisplay;
     
      if Display = nil then Exit;
     
      RootWin := gdk_x11_get_default_root_xwindow;
      WMAtom := XInternAtom(Display,'_NET_ACTIVE_WINDOW', False);
      Valid:=XGetWindowProperty(Display, RootWin, WMAtom, 0, 1, False,
                                     AnyPropertyType, @ActualTypeReturn,
                                     @ActualFormatReturn, @NItemsReturn,
                                     @BytesAfterReturn, @Ptr)=0;
      if Valid then
      try
        if (ActualTypeReturn = None) or (ActualFormatReturn <> 32) or not Assigned(Ptr) then
          Valid := False;
        if Valid then ResultWindow := PWindow(Ptr)^;
      finally
        if Assigned(Ptr) then XFree(Ptr);
      end;
     
      if Valid then Result := {%H-}HWND(gdk_window_foreign_new(ResultWindow));
    end;
    Avec cette modification j'ai la variable ActualFormatReturn qui est bien à 32 maintenant.
    As-tu fait un point d'arrêt dans cette zone pour voir si tu passes dedans ? Quelle valeur a ActualFormatReturn après exécution du XGetWindowProperty ?
    es-tu bien en gtk2 ?
    et merci à Jipété d'avoir testé cette modification qui me répond à ma question :
    but is it good in all linux O.S ? (32 or 64 bits) ?
    Ami calmant, J.P

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Par défaut
    Bonjour,
    J'ai fait un copié/collé de ta modif sur le fichier qui se trouve chez moi dans /usr/lib/lazarus/1.6/lcl/interfaces/gtk2/gtk2widgetset.inc et non dans usr/share/... Pôw grave ;-)

    Ca ne marche pas, toujours un retour de valeur=0. J'ai mis un point d'arrêt et je passe bien dans TGtk2widgetset.X11GetActiveWindow modifié après appel de la fonction.
    Pour contrôle, je fais appel aussi à GetActiveWindow (dans MainForm, juste avant l'appel GetForegroundWindow)) qui me renvoie bien mon handle d'appli lorsque mon application a le focus, 0 dans le cas contraire = tout normal.

    le code hyper compliqué en cadeau ahahahah !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.Timer1Timer(Sender: TObject);   // le timer appelle la fonction toutes les secondes
    begin
      memo1.Lines.Add(format('%d %d',[getActiveWindow,getForegroundWindow]));
    end;
    La sortie du Memo donne ceci :
    12624752 0 // mon appli est active
    12624752 0
    0 0 // j'ai cliqué sur Mozilla ou ailleurs
    0 0
    12624752 0 // j'ai cliqué sur mon appli Laz
    etc...


    Pour info, je suis en Laz 1.6 : c'est là le pb ?
    ludo

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 126
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Salut salut,

    Comme je suis curieux de ce genre de choses, j'ai tenté un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TMainForm.btn4TestsClick(Sender: TObject);
    begin
      Caption := IntToStr(GetForegroundWindow);
    end;
    et ça m'a affiché une valeur que je considère comme valide (sur 9 chiffres, quand même [ex. : 141353912] et qui change), dans la mesure où j'ai suivi l'exécution en pas-à-pas et que ça a été bon tout le temps (Valid = True, etc.)

    Mais moi je me traîne encore avec un vieux Debian 7 / 32 bits et un Laz 1.4.
    Ceci explique peut-être cela.


    De ton autre post, J.P :
    The function XGetWindowProperty return 0 in the ActualFormatReturn variable which is not good ( <> 32 ) .
    En pas-à-pas je l'ai vue à 32 cette valeur. Hélas, aller se traîner dans fpcsrc/.../xlib.pp n'apporte rien à part une fonction qui se mord la queue et que je ne sais pas interpréter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function XGetWindowProperty(para1: PDisplay; para2: TWindow; para3: TAtom;
      para4: clong; para5: clong; para6: Boolean; para7: TAtom; para8: PAtom;
      para9: Pcint; para10: Pculong; para11: Pculong; para12: PPcuchar): cint;
    begin
      Result := XGetWindowProperty(para1,para2,para3,para4,para5,ord(para6),para7,para8,para9,para10,para11,para12);
    end;

Discussions similaires

  1. Réponses: 12
    Dernier message: 23/01/2008, 09h17
  2. Réponses: 6
    Dernier message: 07/09/2005, 20h31
  3. [Excel] Utiliser une application externe par une macro
    Par thierry2.dlp dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/08/2005, 22h07
  4. Comment retrouver le handle d'une application console?
    Par Laurent Dardenne dans le forum Windows
    Réponses: 7
    Dernier message: 22/12/2004, 16h58
  5. Récupérer le Handle d'une Appli externe
    Par luxprog dans le forum Windows
    Réponses: 15
    Dernier message: 29/04/2004, 13h47

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