Page 1 sur 2

Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 15:27
par Kayne
La question est résumée dans le titre.
Il est possible de créer des fenêtres invisibles (#PB_Window_Invisible) , il est possible de simuler un clic de la souris (mouse_event_(#MOUSEEVENTF_LEFTDOWN,0,0,0,0) par exemple). Est-il possible de faire les 2 à la fois c'est à dire de faire cliquer l'utilisateur sur un bouton par exemple de ma fenêtre invisible ? Ou une autre solution serais de faire ça en dehors de l'écran visible de l'utilisateur. Mais s'il est possible d'ouvrir une fenêtre en dehors de l'ecran il n'est pas possible de faire aller la souris en dehors de l'ecran (en tout cas pas avec SetCursorPos_(sourisX ,sourisY) ). Est-ce que quelqu'un voit une solution ?

Re: Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 16:18
par Chris
Essaye ça.

Code : Tout sélectionner

Enumeration
  #MyWinVisible
  #MyWinInvisible
EndEnumeration

Enumeration 
  #BoutonVisible
  #BoutonInvisible
EndEnumeration

Procedure CallBack(hWin, Msg, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  
  Select Msg
    Case #WM_COMMAND
      If wParam & $FFFF = #BoutonInvisible And (wParam>>16) & $FFFF = #BN_CLICKED
        Debug "Vous m'avez cliqué?"
      EndIf
      
  EndSelect
  ProcedureReturn Result
EndProcedure

If OpenWindow(#MyWinVisible, 230, 160, 400, 400, "Fenetre visible", #PB_Window_SystemMenu)
  ButtonGadget(#BoutonVisible, 10, 10, 100, 20, "Cliquez moi")
EndIf

If OpenWindow(#MyWinInvisible, 0,0,0,0, "Fenetre invisible", #PB_Window_Invisible)
  ButtonGadget(#BoutonInvisible, 0, 0, 10, 10, "")
EndIf

SetWindowCallback(@CallBack())

Repeat
  Select WaitWindowEvent()
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #BoutonVisible
          SetActiveWindow_(WindowID(#MyWinInvisible))
          SendMessage_(GadgetID(#BoutonInvisible), #BM_CLICK, 0, 0)
          SetActiveWindow(#MyWinVisible)
          
      EndSelect
    Case #PB_Event_CloseWindow
      Quit = #True
      
  EndSelect
Until Quit
End

Re: Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 16:29
par falsam

Code : Tout sélectionner

Procedure HookActionCallBack(nCode, wParam, lParam)  
  Select wParam
      Case #WM_RBUTTONDOWN
        Debug "Bouton droit de la souris enfoncé."
        
      Case #WM_RBUTTONUP
        Debug "Bouton droit de la souris relaché."
        
      Case #WM_LBUTTONDOWN
        Debug "Bouton gauche de la souris enfoncé."
   
      Case #WM_LBUTTONUP
        Debug "Bouton gauche de la souris relaché."
        
      Case #WM_MBUTTONDOWN
        Debug "Bouton central de la souris enfoncé."
        
      Case #WM_MBUTTONUP
        Debug "Bouton central de la souris relaché."
        
    EndSelect
    
  ProcedureReturn CallNextHookEx_(HookHandle, nCode, wParam, lParam)
EndProcedure

;Exécution du Hook
HookMouseHandle = SetWindowsHookEx_(#WH_MOUSE_LL,@HookActionCallBack(), GetModuleHandle_(0),0)

OpenWindow(1, 10, 10, 10, 10, "", #PB_Window_Invisible)
StickyWindow(1, 1)

Repeat
 
Until WaitWindowEvent()=#PB_Event_CloseWindow

;On libére les Hooks à l'aide de la fonction UnHookWindowsHookEx
UnhookWindowsHookEx_(HookMouseHandle)
P.S. : Non compatible Linux ou Mac

Re: Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 19:23
par Ar-S
falsam a écrit :Il y a quelques mois j'avais donné une solution afin de détecter la frappe au clavier en mode furtif depuis n'importe quelle applications windows ou depuis le bureau de window. j'ai amélioré ce code en ajoutant la détection des touche de la souris.

Code : Tout sélectionner

Structure KBDLLHOOKSTRUCT
  vkCode.i 
  scanCode.i 
  flags.i 
  Time.i 
  dwExtraInfo.i
EndStructure

;Procédure qui devra être appelée lorsque circulera un message de type "Clavier"
Procedure HookActionCallBack(nCode, wParam, lParam) 
  Protected *keyBoard.KBDLLHOOKSTRUCT=lParam
  Dim keyState.b (255)
  
  ;Souris
  Select wParam
      Case #WM_RBUTTONDOWN
        Debug "Bouton droit de la souris enfoncé."
        
      Case #WM_RBUTTONUP
        Debug "Bouton droit de la souris relaché."
        
      Case #WM_LBUTTONDOWN
        Debug "Bouton gauche de la souris enfoncé."
   
      Case #WM_LBUTTONUP
        Debug "Bouton gauche de la souris relaché."
        
      Case #WM_MBUTTONDOWN
        Debug "Bouton central de la souris enfoncé."
        
      Case #WM_MBUTTONUP
        Debug "Bouton central de la souris relaché."
        
    EndSelect
    
  ;Clavier
  If (nCode=#HC_ACTION) And (wParam = #WM_KEYDOWN)
    Ascii.w=0
    GetKeyboardState_(@KeyState(0))
    ;Le paramètre wparam renvoie le code virtuel de la touche
    ;pour le convertir en Ascii si c'est un caractère, on utilise cette fonction
    ToAscii_(wParam,(lParam>>16) & $FF ,@KeyState(0),@Ascii,0)
    
    Debug Str(*keyBoard\vkCode) + "  ("+Chr(*keyBoard\vkCode)+")"
  EndIf 
  ProcedureReturn CallNextHookEx_(HookHandle, nCode, wParam, lParam)
EndProcedure

;Exécution du Hook
HookMouseHandle = SetWindowsHookEx_(#WH_MOUSE_LL,@HookActionCallBack(), GetModuleHandle_(0),0)
HookKeyBoardHandle=SetWindowsHookEx_(#WH_KEYBOARD_LL, @HookActionCallBack(), 0, 0)

OpenWindow(1, 10, 10, 10, 10, "", #PB_Window_Invisible)
StickyWindow(1, 1)

Repeat
 
Until WaitWindowEvent()=#PB_Event_CloseWindow

;On libére les Hooks à l'aide de la fonction UnHookWindowsHookEx
UnhookWindowsHookEx_(HookMouseHandle)
UnhookWindowsHookEx_(HookKeyBoardHandle)
P.S. : Non compatible Linux ou Mac
Merci pour ce code,
par contre chez moi il capte bien les lettres mais pas les : ; / etc.. ça affiche les ¼ ¾ ¿ etc..

Re: Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 20:01
par nico
@falsam,

Quel sont tes sources,, j'ai posté un code en 2009 expliquant comment faire un keylogger, il y a plusieurs bizarreries dans ton code,

GetKeyboardState_(@KeyState(0)) et ToAscii_(wParam,(lParam>>16) & $FF ,@KeyState(0),@Ascii,0) ne serve à rien puisque tu ne te sert pas de la valeur de retour qui est ascii mais de toute façon les paramètres passés ne sont pas bon.

@kaine,
je ne comprend pas ta demande, si tu fait une fenêtre invisible comment savoir si le clic correspond au bouton car justement celui-ci n'est pas visible.
Si tu pouvais expliquer le but de ta demande, la finalité, on serais surement en mesure de t'aider.

si tu veux qu'il se passe quelque chose quand l'utilisateur clique à un endroit précis, tu as juste besoin de getcursorpos_()

Re: Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 22:42
par falsam
nico a écrit :@falsam,

Quel sont tes sources
Je m'étais basé à l'époque sur ce lien ainsi que sur le MSDN consacré aux différentes API. Ayant fait plusieurs essais j'ai oublié de faire du nettoyage.

La demande de Kaine ne portant que sur les évènements de la souris sur une fenêtre transparente je corrige mon code.

Re: Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 23:24
par Chris
nico a écrit :si tu veux qu'il se passe quelque chose quand l'utilisateur clique à un endroit précis, tu as juste besoin de getcursorpos_()
Non, pas dans son cas.

GetCursorPos() renvoie des coordonnées écran.
Si pour une raison ou une autre, la fenêtre est déplacée, les coordonnées du clic ne sont plus valides.
C'est déjà vrai pour une fenêtre qu'on peut voir, alors pour une fenêtre invisible... :wink:

Re: Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 23:28
par falsam
Quel idée de vouloir cliquer sur une fenêtre invisible !!! :p

Re: Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 23:32
par nico
Je suis désolé mais c'est pas un problème d'adapter les coordonnées écran à la fenêtre, je crois que la fenêtre invisible ne sert à rien dans son cas, il voulait juste trouvé un moyen de capturer un évènement à un endroit précis.

C'est pour cela qu'il aurait été plus judicieux pour lui d'expliquer le problème que de partir sur une idée.

T'es pas couché à cette heure ci, t'as pas de boulot demain :)

Re: Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 23:35
par Chris
Je pourrais te retourner la question! :mrgreen:

Re: Simuler un clic sur une fenêtre invisible

Publié : dim. 22/mai/2011 23:42
par Chris
falsam a écrit :Quel idée de vouloir cliquer sur une fenêtre invisible !!! :p
C'est à peu près ce que je me suis dit quand j'ai vu son post.
Faut avoir l'esprit un peu tordu pour aller faire cliquer un mec sur un bouton qu'on ne peut pas voir! :mrgreen:

Re: Simuler un clic sur une fenêtre invisible

Publié : sam. 28/mai/2011 14:21
par Kayne
@chris C'est pas mal ton code je savais pas qu'on pouvais faire cliquer un bouton tout seul sans l'aide de la souris.

Mais ce que je cherche c'est pas seulement de cliquer sur un bouton dans une fenêtre invisible mais de pouvoir cliquer sur un point repéré par ses coordonnées qu'elles qu'elles soient (on reste dans la fenêtre quand même) et qu'en plus la fenêtre puisse "savoir" que le mec a cliquer et poursuivre les instructions. Comme si je voulais cliquer sur un point particulier d'une image que j'affiche sur une fenêtre invisible..

@falsam Je comprends pas bien ton code je suis très peu familier avec les hooks. Mais j'ai l'impression que je peut savoir quand le mec clique ou non mais je n'est pas l'impression que ce soit "pris en compte" par la fenêtre.

Je comprends qu'un exemple d'application pourrait éclairer un peu ma demande.
Imaginons que je réussisse à lancer le programme de quelqu'un dans une fenêtre que j'ai moi même créé et cette fenêtre est invisible. Je suis sur la page d'accueil du programme (un jeu par exemple)..
Ma demande est la suivante: Comment faire cliquer l'utilisateur à un endroit précis de cette fenêtre invisible et que le programme fasse comme si l'utilisateur avait vraiment cliqué sur cet endroit (si c'est un jeu je voudrais pouvoir cliquer sur le bouton "jouer" et que le jeu se lance effectivement).

Voila j'espere que c'est plus clair.

Re: Simuler un clic sur une fenêtre invisible

Publié : sam. 28/mai/2011 14:59
par falsam
Kayne a écrit :Ma demande est la suivante: Comment faire cliquer l'utilisateur à un endroit précis de cette fenêtre invisible.
Comment demander à un utilisateur de cliquer sur un endroit précis d'une fenetre ....... invisible !!
Demande lui pour connaitre sa réaction.
Kayne a écrit :..... et que le programme fasse comme si l'utilisateur avait vraiment cliqué sur cet endroit (si c'est un jeu je voudrais pouvoir cliquer sur le bouton "jouer" et que le jeu se lance effectivement).
Un programme fait ce qu'on lui demande de faire. Il ne fait pas semblant.
Kayne a écrit :Voila j'espere que c'est plus clair.
Pour moi non. Les autres je ne sais pas.

Re: Simuler un clic sur une fenêtre invisible

Publié : sam. 28/mai/2011 15:28
par Backup
................

Re: Simuler un clic sur une fenêtre invisible

Publié : sam. 28/mai/2011 18:01
par Chris
Quand vous posez une question, ce serait bien d'essayer de vous expliquer clairement parce que je vous jure qu'il y a des moments, faut vraiment arriver à vous suivre. :|