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 :

HookMouse Dll interception application externe


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut HookMouse Dll interception application externe
    Bonjour à toutes et à tous,

    J'aimerais savoir si un HookMouse (sous forme de Dll) peut intercepter ce genre de chose sur une application externe (application en VB).

    1) L'utilisateur clique sur un Menu
    2) une fenêtre apparait sur laquelle il clique sur un Bouton (je ne sais pas si c'est un TButton)
    3) une deuxième fenêtre en children de la précédent apparaît
    4) sur cette fenêtre il y a une sorte de Tedit avec un petit icone,
    ICI 2 CAS POSSIBLE :
    - l'utilisateur clique sur l'icone qui ouvre un liste (genre DBGrid), il double clic sur une des lignes pour récupérer le code (champ cle primaire)
    OU
    - l'utilisateur saisie le code et fait entrée

    En tout etat de cause le fameux Tedit récupère donc un code.

    C'est ici que je voudrais intercepter, juste apres que le code soit récupéré dans ce pseudo Tedit. (genre OnExit)
    Le but étant de lancer une vérification dans la base et d'envoyer une fenêtre d'information si ce code n'est pas autorisé à l'utilisation ou de rien faire si il est autorisée.


    Avant de m'engager la dedans, je voudrais juste savoir :
    - si c'est possible d'intercepter ?
    - si c'est possible de vider le text de ce Tedit si j'ai besoin ?
    - si le hookmouse est fiable ?

    Et quelque tuto précis.


    Je vous remercie pour vos lumières.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    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 096
    Par défaut
    Détecter l'Edit, cela sefait par EnumChildWindows ou FindWindowsEx
    Modifier l'Edit, un SendMessage avec WM_SETTEXT, rien de plus simple
    Voir si GetFocus peut t'aider pour détecter un pseudo OnExit
    Il est possible avec WH_GETMESSAGE de récupérer les messages de l'ensemble des applis, tu dois donc pouvoir capturer le WM_SETFOCUS et WM_KILLFOCUS

    tient pour te faire une idée du WH_GETMESSAGE, bon là c'est via WM_PAINT mais l'idée est là même
    C'est directement dans le Code du DPR de ma DLL

    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
    function HookPaintProc(Code: Integer; RemoveOrNot: WPARAM; MSG: LPARAM): LRESULT; stdcall;
    var
      DC: HDC;
      TextString: ShortString;
    begin
      Result := 0;
     
      with TMsg(Pointer(MSG)^) do
      begin
        if message = WM_PAINT then
        begin
          DC := GetDC(hwnd);
          if DC > 0 then
          begin
            SendMessage(hwnd, message, wParam, lParam); // ne provoque pas de HookPaintProc ... j'aurais cru que ...
            TextString := '';
            GetClassName(hwnd, @TextString[1], 255);
            TextOut(DC, 0, 0, @TextString[1], StrLen(@TextString[1]));
     
            message := WM_NULL;
          end;
        end;
      end;
    end;
     
    function StartPaintHook(): HHOOK; stdcall;
    begin
      Result := SetWindowsHookEx(WH_GETMESSAGE, HookPaintProc, HInstance, 0);
    end;
     
    procedure StopPaintHook(HookPaintHandle: HHook); stdcall;
    begin
      if HookPaintHandle <> 0 then
        UnhookWindowsHookEx(HookPaintHandle);
    end;
    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
    procedure TFrmTestDivers.BtnHookPaintStartClick(Sender: TObject);
    var
      _StartPaintHook: function(): HHOOK; stdcall;
    begin
      if HookPaintHandleDLL = 0 then
        HookPaintHandleDLL := LoadLibrary('DLLTest.dll');
      if HookPaintHandleDLL <= 0 then
        Exit;
     
      @_StartPaintHook := GetProcAddress(HookPaintHandleDLL, 'StartPaintHook');
      if Assigned(@_StartPaintHook) then
      begin
        try
          HookPaintHandle := _StartPaintHook();
        except
          on E: Exception do ShowMessage(E.Message);
        end;
      end;
    end;
     
    procedure StopPaintHook();
    var
      _StopPaintHook: procedure(HookPaintHandle: HHook); stdcall;
    begin
      if HookPaintHandle <= 0 then
        Exit;
     
      if HookPaintHandleDLL <= 0 then
        Exit;
     
      @_StopPaintHook := GetProcAddress(HookPaintHandleDLL, 'StopPaintHook');
      if Assigned(@_StopPaintHook) then
      begin
        try
           _StopPaintHook(HookPaintHandle);
        except
          on E: Exception do ShowMessage(E.Message);
        end;
      end;
    end;
     
    procedure TFrmTestDivers.BtnHookPaintStopClick(Sender: TObject);
    begin
      StopPaintHook();
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 941
    Par défaut
    @Buzz

    Je répondrais dans l'ordre inverse des questions
    - si le hookmouse est fiable ?
    Il l'est... mais pas adapté au opérations que tu veux tester. Regarde d'autres formes de hook comme proposé par Shai.

    - si c'est possible de vider le text de ce Tedit si j'ai besoin ?
    SetWindowText

    si c'est possible d'intercepter ?
    Ben y'a quant même pas mal d'approximations dans ton truc
    • je ne sais pas si c'est un TButton
    • une sorte de Tedit
    • ICI 2 CAS POSSIBLES
    • un liste (genre DBGrid)
    • En tout etat de cause le fameux Tedit récupère donc un code


    Faudra essayer d'être plus précis

    @ShaiLeTroll

    Ce hook n'est pas vraiment net

    Ce SendMessage en effet devrait provoquer de la réentrance Il devrait simplement être remplacé par CallNextHookEx.
    De plus puisque CallNextHookEx n'est jamais appelée, ça devrait perturber l'ensemble des traitements puisque tu ne fais jamais suivre les messages

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    @ShaiLeTroll

    Avec tes infos (surtout le terme EnumChildWindows ) j'ai pu faire pas mal de recherche.
    J'en suis à me demander pourquoi passer par une Dll !!, autant gérer cela dans mon appli car de tout façon il me faudra une appli qui s'execute au lancement de windows.

    Bref, pour faire cours, je suis entrain de récupérer les infos en dessous de ma souris en utilisant la FAQ

    Mais même avec cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
             //récupération des information du contrôle
            Hd:=WindowFRomPoint(NewMousePos);
            GetWindowText(hd,WText,SizeOf(WText));
            GetClassName(hd,ClassName,SizeOf(ClassName));
    Les infos que je récupère ne sont pas assez précise, j'aimerais par exemple récupérer le name du composant exacte.

    @AndNotOr

    Alors pour être plus précis, voilà la décomposition de mes points :


    1) je clique sur le menu Vente et je choisie Devis [image au dessus]
    La je récupére = 5572702 : - #326768
    (Même probleme si je clique sur un autre menu j'ai la même chose !!! le délir)


    2)Une fenêtre s'ouvre [image au dessus]
    Là je récupère = 5638238 : Devis Clients - ThunderRT6FormDC

    3)Je clique sur Créer
    Sur le bouton Créer je récupère = 3672730 - &Créer;Ins - Button


    4)une Fenêtre s'ouvre [image au dessus]
    Là je récupère (pour cette form) = 6817998 - Devis Client[Créer] - ThunderRT6FormDC

    5)
    Dans cette fenêtre, c'est ce Edit de code Client que je souhaite Hooké.
    Je récupère cela comme info dessus = 4197660 - Edit

    Je pense pouvoir aller jusqu'au 4 afin de savoir si on est bien devant la fenêtre de création de devis, mais je seche sur comment être sur de capter le onexit de ce phameux Edit ?

    Est-ce plus claire ?

    @Merci

    [EDIT] : je viens d'essayer de faire le SetWindowText (evidement j'ai ecrit a la main le Hd). Alors à ma grande surprise je récupère bien cela
    4197660 coucou - Edit
    Mais je vois rien du tout dans l'appli cela reste vide ????????????

    Comment expliquer cela ?

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    @Je continue,

    Je viens d'essayer Spy++ pour voir si c'est pas moi qui délire.

    Et je tombe toujours sur le même problème, tous les composants images (voir en dessous point 3) ) sont de la forme
    Handle xxxxxx <= numéro qui change à chaque ouveture du programme (enfin si j'ai ouvert autre chose avant)
    Edit <=== ClassName

    Ces infos sont équivalent que ce soit sur CodeClient / Numéro / Ou date ou une autre qui est cachée. voilà les valeurs :

    Handle : GetWindowsText - GetClasseName
    3738476 : 12345678 - Edit (pour celle a côter du label Numéro)
    4786978 : Facture! - Edit (pour celle où il y à d'écrit Devis)
    2886108 : 23/09/10 - Edit (pour la date, qui selon le jour)
    3803886 : - Edit (pour celle du label code Client)

    Apres analyse, a la rigueur je pourrais recherche dans cette MDIForm le control qui n'a pas de GetWindowsText, car celui que je cherche est le seul dans cette fenêtre que je ne récupère pas de Text.

    Mon soucis c'est que je n'arrive pas à écrire dedans ni d'ailleur dans un autre Edit, en fait le setwindowText fonctionne, mais rien ne s'affiche visuellement dedans !!!

    J'ai pu aussi remarquer en appliquant mon prog sur une appli delphi que ce qui est dit comme un control Edit c'est en fait des TCombobox cela doit être le Text surement de ce composant !!!

    - Alors comment je peux écrire dedans ?
    - Et avez vous des exemple d'interception de onexit ou autre evenement sur des Controls d'application externe ?

    Merci pour vos lumières.


    PS : Même avec mon hook que j'ai fais au début me retourne la même info.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 941
    Par défaut
    Allez piocher des informations dans le gui d'une application tiers... Buzz... t'es pas sorti de l'auberge

    T'as pas un autre moyen de récupérer cet ID ? Lecture d'une DB, d'un fichier, COM...

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/08/2010, 10h22
  2. Intercepter message application externe
    Par Te-Deum dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 22/08/2007, 16h01
  3. Réponses: 2
    Dernier message: 02/08/2006, 19h55
  4. Appel application externe
    Par gerald2545 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 28/01/2005, 18h54
  5. Communication dll vers application
    Par portu dans le forum Langage
    Réponses: 8
    Dernier message: 27/02/2004, 17h54

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