Bonjour,
Est-il possible a partir de mon application de simuler un click de souris sur un bouton d'une autre application ?
Si oui, auriez-vous un exemple SVP ?
Merci d'avance
Fred
Bonjour,
Est-il possible a partir de mon application de simuler un click de souris sur un bouton d'une autre application ?
Si oui, auriez-vous un exemple SVP ?
Merci d'avance
Fred
D'après moi ceci devrait fonctionné:
Bien sûr il faut trouver les bonnes infos sur le bouton.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SendMessage(hParent, WM_COMMAND, MAKELONG(ID_de_ton_control, BN_CLICKED), (LPARAM)hButton);
Pour plus d'info sur le message BN_CLICKED:
http://msdn.microsoft.com/en-us/library/aa452896.aspx
Si c'est simuler un click sur un bouton d'une application totalement independante de celle que tu utilise c'est possible, mais il te faut recuperer les Handles de la Form, et des divers elements, jusqu'au boutton
Tiens voici une solution plus complète que j'ai volé sur Experts Exchange
Pour trouvé certaine information tu dois utilisé un programme comme WinSpy++.
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 //------------ 1er - trouvé la fenêtre ------------// HWND hDlg = FindWindowEx(NULL, NULL, m_lpszClass, (LPCTSTR)m_strWindowText); //------------ 2e - trouvé et cliqué sur le bouton ------------// if (hDlg) { HWND hControl = 0; hControl = GetDlgItem(hDlg, m_nControlID); if ( PostMessage(hDlg, WM_COMMAND, (WPARAM)((BN_CLICKED*0x10000)+m_nControlID), (LPARAM)hControl) ) if ( ! m_bLurk) return true; }
je connaissais pas ton tool sinon pour recuperer id handle
il y a aussi un super outil dispo à l install d autoIt : Au3Info.exe
http://www.autoitscript.com/autoit3/
Salut,
Merci pour vos reponses, je vais essayer...
Juste encore une petite question:
Si je ne me trompe pas , l'ID de mon control (button) change a chaque nouvelle execution de l'application ? Comment je peux faire car dans vos exemples on a besoin d'un ID pour le control ?
cedni, je suis alle voir Au3Info.exe, et ca a l'air pas mal du tout ce soft, mais je voudrais essayer de le faire moi meme dans mon application. Si vraiment je n'y arrive pas, alors je me rabattrais sur Au3Info.exe.
Merci
Fred
Il faut pour recuperer le Handle d'une Form utiliser comme la dit Crayon un utilitaire comme WinSpy++ qui va te lister touts les programmes en cour, ca te permet de recuperer le nom de la fenetre, et son Handle
Normalement la variable m_nControlID ne devrais pas changer si c'est toujours le même bouton. Avec WinSpy++ sélectionne le bouton et regarde la valeur à côté de Control ID.
Les seuls valeurs qui changent sont les valeurs défini par HWND.
Pour remplir la variable m_lpszClass il faut sélectionné la fenêtre complète de ton application et regarder la valeur à Class. Par exemple, avec Firefox on obtient MozillaUIWindowClass. Et on rempli m_strWindowText avec le texte qui est dans Caption.
Pour plus d'info sur FindWindowEx va voir:
http://msdn.microsoft.com/en-us/libr...00(VS.85).aspx
char buf[300];
HWND code;
// récupéré le handle d'un objet se trouvant en dessous de la souris
code = WindowFromPoint(mouse->CursorPos);
// lecture du nom de l'objet en dessous de la souris
GetWindowText(code,buf,300);
met ce code dans un timer et place 1 liste sur ta form.
passe la souris sur les bouton edit etc.. des fenêtres et tu verra
ta liste se remplir.
tu peux même modifier les autres application.
SetWindowText(code,"coucou");
pour faire une farce a qqn g mélanger et effacer certains bouton de la calculatrice de windows
@+
Salut,
J'ai reussi a faire ceci pour un bouton :
Ce code fonctionne bien, mais ca se complique car je croyais que c'etait sur un bouton que je devais simuler le click, mais en fait c'est sur un bouton d'une TToolBar.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 HWND Handle = GetWindow(hParent ,GW_CHILD); PCHAR Titre = StrAlloc(256); GetClassName(Handle, lpRes, sizeof(lpRes)); if ((AnsiString)lpRes == "TButton") { GetWindowText(Handle, lpRes,256); int ID = GetDlgCtrlID(Handle); SendMessage(hParent, WM_COMMAND, MAKELONG(ID, BN_CLICKED), (LPARAM)Handle); }
Donc quelle est la fonction permettant d'envoyer via SendMessage pour simuler le click d'un bouton sur la TToolBar ?
Merci
Normalement la même façon devrait fonctionner (avec un BN_CLICKED).
J'ai essaye ceci :
Il trouve bien tout mes boutons de la ToolBar, mais par contre pour chaque bouton, pTBBtn contient toujours 0. Donc je n'ai pas de idCommand.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 int iNb = SendMessage(Handle, TB_BUTTONCOUNT,0,0); int nIDCommand = -1; TBBUTTON pTBBtn; memset(&pTBBtn,0,sizeof(TBBUTTON)); for (int i = 0; i < iNb; i++) { SendMessage(Handle, TB_GETBUTTON, (WPARAM) i, (LPARAM)&pTBBtn); nIDCommand = pTBBtn.idCommand; SendMessage(Handle, TB_PRESSBUTTON, nIDCommand, MAKELPARAM(1, 0)); }
Peut-etre que j'ai oublie quelque chose ?
J'ai trouvé comment faire sur ce site:
http://blog.csdn.net/seu07201213/arc...07/891274.aspx
Voici mon code que j'ai tester en C sous Visual C++:
J'ai harcoder mon Handle pour fin de test.
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 HWND Handle = (HWND)0x02550C86; HANDLE hProcess; int iNb; int nIDCommand = -1; unsigned long n = 0; TBBUTTON *pButton; DWORD pid = 0; pButton = (TBBUTTON *)malloc(sizeof(TBBUTTON)); GetWindowThreadProcessId(Handle, &pid); hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_ALL_ACCESS, 1, pid); iNb = SendMessage(Handle, TB_BUTTONCOUNT, 0, 0); for (int i = 0; i < iNb; i++) { TBBUTTON pTBBtn = { 0 }; SendMessage(Handle, TB_GETBUTTON, (WPARAM)i, (LONG)(LPARAM)&pTBBtn); ReadProcessMemory(hProcess, &pTBBtn, pButton, sizeof(TBBUTTON), &n); nIDCommand = pButton->idCommand; SendMessage(GetParent(Handle), WM_COMMAND, MAKELONG(nIDCommand, BN_CLICKED), (LPARAM)Handle); } free(pButton);
Tu peux utiliser new/delete si tu veux. Étant donné que j'étais en C...
Merci Crayon.
J'ai essaye ton code, et ca marche.
Par contre ce qui est bizarre, c'est que ca ne marche pas pour toutes les toolbars. Sur certaines fenetres ca ne marche pas.
D'ailleurs avec mon exemple fait avec builder ( 1 TForm + 1 TToolBar avec 2 buttons) ca ne marche pas.
Vraiment etrange.
Bonjour,
je cherche à faire un bot qui serait capable de remplir un formulaire et forcément j'ai besoin de pouvoir interragir sur une autre application. voila donc pourquoi je suis sur ce topic car c'est bien ce genre de méthode dont j'ai besoin.
cependant, je ne suis suis pas tres doué dans ce domaine.. disons que j'ai essayé d'implémenter vos exemples mais j'ai plusieurs erreurs.
Je développe avec Borland Developper Studio 6 (C++ Builder) et j'ai copié vos codes dans un bouton mais la plupart des *trucs genre 'hParent' etc ne sont soit disant pas définis.... faut-il importer des bibliotheques ?
comment le bot sait-il sur quelle fenetre il faut cliquer ? il faut que toutes les autres soit fermées ?
à la limite, serait-il possible d'avoir le code source de WinSpy++ ?
tant de questions... lol
bon je continue mes tests en attendant vos réponses merci ++
Salut Blako_17,
Non pas besoin de bibliotheques.
hParent correspond au HWND parent (ma form principale).
Pour le code source de WinSpy, je crois que ca se trouve a cette adresse : http://www.catch22.net/source/
Partager