Je simuler un click sur le menu d'une autre application.
Je m'explique :
Je veux à partir de mon application lancer un executable comme "paint" puis simuler l'accès au menu "Fichier>ouvrir" pour ouvrir la boîte de dialogue.
Je simuler un click sur le menu d'une autre application.
Je m'explique :
Je veux à partir de mon application lancer un executable comme "paint" puis simuler l'accès au menu "Fichier>ouvrir" pour ouvrir la boîte de dialogue.
Salut
ya plusieurs facons de leur fait , tu peux deja proceder comme ceci :
- shellexecute paint
tu prend le handle de paint.
- setforegroundwindow(handlepaint)
- Setcursorposition (
ect...
Sinon tu peux faire un Sendmessage(handlepaint,...,CTRL + o ) c'est plus simple de cette maniére .
Documente toi sur les API que j'ai cité , la syntaxe n'est pas la bonne j'ai fait ca rapidement
Merci.
C'est un bon fil.
Mais, j'ai encore une petite question, si j'utilise SetCursorPosition comment je pourrais connaitre la position du menu à cliquer?
Ya des utilitaires pr trouver la position du curseur, donc tu pourrais tester...
mais si la resolution change , les valeurs changeront aussi ect...
Donc c'est une facon assez bourrine si tu vois ce que je veux , il vaudrait mieux que tu utilises Sendmessage
pourqoi pas simuler les touches de racourcis?
avec: key_event (voir dans la faq)
PAS DE DESTIN, C'EST CE QUE NOUS FAISONS
Si je lance mon application spécifique chemin\monappli.exe, comment je fais pour récupérer le handle?Envoyé par K.othmane
Tout ça, c'est dans les sources du premier défi qui seront très très bientôt en ligne.
Pour te faire patienter, voici un extrait de l'article :
Et mes sources dans lequel tu trouvera l'unité qui te sera utile.Ces fonctions sont pour la plupart regroupées dans l'unité UnitSystem.pas. Elle permettent entre autre :
* de fermer une application externe si on connait le Handle de sa fiche principale (FermerApplication). Cette fonction est utilisée dans le OnClose de la fiche principale.
* de simuler des clics de souris de deux façons différentes : clic réel et clic virtuel (voir les procédures MouseClickOnScreen et VirtualMouseClickOnWindow). La première procédure utilise la fonction de l'API mouse_event, la seconde utilise le sytème d'envoi de messages Windows classique avec PostMessage.
* de simuler les frappe de clavier (voir les procédures SimulateKeyDown, SimulateKeyUp, SimulateKeystroke, et SendKeys). On doit noter ici que l'on trouve sur internet une unité SendKeys.pas, beaucoup plus complexe, sans doute plus aboutie, mais que je n'ai pas réussi à utiliser. Ici, j'ai essayé de rester simple et ça mieux marché en utilisant la fonction de l'API Windows keybd_event qui permet d'envoyer des évènement claviers à la fenètre de Windows qui possède le Focus...
* ....Comment mettre le Focus sur une fenètre ? En cliquant sur sa barre de titre (voir la procédure ActiverFenetre)
* d'obtenir la couleur d'un pixel d'une fenètre particulière (voir la fonction CouleurPixel qui utilise l'API Windows GetPixel).
Pour mesurer le temps mis par mon programme pour résoudre une partie, je me suis appuyé sur la fonction API GetTickCount (méthodes StartChrono et StopChrono de la classe TStatistiques). En passant tous les calcul des statistiques sur les pourcentages de réussite ou d'échec du Bot-démineur sont dévolues à la classe TStatistiques, implémentée dans la variable globale Statistiques de l'unité UnitStats.pas.
Dans les sources, unité principale, tu trouveras aussi comment je lance le démineur, énumère les fenêtres ouvertes, identifie celle qui correspond au démineur et finalement récupère son Handle.
Voilà
Bidouilleuse Delphi
PAS DE DESTIN, C'EST CE QUE NOUS FAISONS
J'ai écrit ce code pour simuler le Hot key Alt+F dans une application mais ça ne marche pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 OpenDialog1.Execute; appname:=OpenDialog1.FileName; ShellExecute(0, 'OPEN',pchar(appname), nil, nil, SW_SHOWNORMAL); HInst := FindWindow(nil, 'Rainbow Technologies Sentinel'); SetWindowPos(hInst, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE); SendMessage(Hinst,WM_KEYDOWN,VK_LMENU,0); SendMessage(Hinst,WM_KEYDOWN,ord(F),0); SendMessage(Hinst,WM_KEYUP,ord(F),0); SendMessage(Hinst,WM_KEYUP,VK_LMENU,0);
Quelqu'un a-t-il une idée?
Si tu fais une recherche sur le forum, il y a des fils de discussions où j'explique comment simuler les appuis de touches pour naviguer dans les menus.
C'est aussi dans les sources que je t'ai fourni.
Pour que celà fonctionne, il faut d'abord donner le Focus à la fenètre qui reçoit les messages clavier, sinon ça ne marche pas.
Bidouilleuse Delphi
es-tu sûr de "ord(F)"?
Vérifies le code exact de la touche 'F' en faisant un énènement OnKeyPress sur un Editeur. Le paramètre Key te permettra de vérifier exactement le code correspondant à la touche F.
on aura tout vu...
Mais où est-ce???...
------------------------------------------------------
n'oublies pas les balises [code ][/code ]
et le Tag
oui, normalement, c'est :
ça marchera beaucoup mieux comme ça...
Code : Sélectionner tout - Visualiser dans une fenêtre à part Ord('F')
Bidouilleuse Delphi
Bonjour à tous
Dans la simulation de touches clavier, j'ai le probléme pour la touche \ en réalité la fonction écrit _ je suppose que l'on doit rajouter par les simulatekeydown puis Up des touches VK_CONTROL et VK_MENU mais sans résultat
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 Procedure ecrire(s:string); Var i:integer; Flag: boolean; w: word; begin Flag:= not GetKeyState(VK_CAPITAL)=1; If Flag then SimulateKeystroke(VK_CAPITAL,0); For i:=1 to length(s) do begin w:=VkKeyScan(s[i]); If ((HiByte(w)<>$FF) and (LoByte(w)<>$FF)) then begin If HiByte(w) =1 then SimulateKeyDown(VK_SHIFT); SimulateKeystroke(LoByte(w),0); If HiByte(w) =1 then SimulateKeyUp(VK_SHIFT); end else begin SimulateKeydown(VK_CONTROL); SimulateKeydown(VK_MENU); SimulateKeystroke(LoByte(w),0); SimulateKeyUp(VK_CONTROL); SimulateKeyUp(VK_MENU); end; end; If Flag then SimulateKeystroke(VK_CAPITAL,0); sleep(300); end;
Merci pour votre aide
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager