bonjour à toutes et à tous,
comme le titre l'indique, y a -t-il un moyen de désactiver un bouton d'une application extérieure après un nombre de clique ?
A+
NABIL74
bonjour à toutes et à tous,
comme le titre l'indique, y a -t-il un moyen de désactiver un bouton d'une application extérieure après un nombre de clique ?
A+
NABIL74
Avec un FindWindow et un EnableWindow pour trouver le controls et le désactiver ...
Par contre, savoir le nombre de clic, plus complexe, peut-être avec une DLL de Hook sur la Souris ?
Ensuite, tu récupères la fenêtre en cours (GetForegroundWindow) et voir tous les clicks se produit dans la zone du control (moi j'utilise ControlAtPos mais c'est pour l'intérieur d'une application delphi, doit falloir trouver un autre moyen, détourner les message à destination de se controle par un Hook aussi ?)
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
salut,
@ Shai,
merci.
je prends toujours notes de tes conseils.Par contre, savoir le nombre de clic, plus complexe, peut-être avec une DLL de Hook sur la Souris ?
Ensuite, tu récupères la fenêtre en cours (GetForegroundWindow) et voir tous les clicks se produit dans la zone du control (moi j'utilise ControlAtPos mais c'est pour l'intérieur d'une application delphi, doit falloir trouver un autre moyen, détourner les message à destination de se controle par un Hook aussi ?)
avant de poster ce topic, j'ai fais beaucoup de tests mais sans trouver de solution! je savais bien que ça serait un peu dur de le faire...
Je continue mes recherches....
s'il y a d'autres idées, je suis preneur.
A+
NABIL74
Bonjour à toutes et à tous,
@ Nabil74, salut vieux frère, tu pourrais peut-être t'orienter vers la propriété "tag" du "Tbutton" à condition que les deux applications soient de ta création.
Pour trouver le "Tbutton" de la deuxième application comme l'a suggéré l'ami ShaiLeTroll, tu peux faire comme ceci :
Deux TEdit (Nomwin.text et Nombtn.text)
//Nomwin.text = nom de la fenêtre et Nombtn.text = nom du Tbutton à cliquer
J'ai testé et c'est Ok.
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 var Main_Form: TMain_Form; function ClickOnTargetBtn(WinName, ButtonName : string) : boolean; implementation {$R *.dfm} function ClickOnTargetBtn(WinName, ButtonName : string) : boolean; var ProgramHwnd, ButtonHwnd : THandle; Mem : Integer; begin Result := False; //resultat no au début! //Retrouve le Handle de la fenêtre principale ProgramHwnd := FindWindow(nil, PChar(UpperCase(WinName))); if ProgramHwnd = 0 then Exit //Si on trouve pas on sort else begin //Avoir le handle du bouton ButtonHwnd := FindWindowEx(ProgramHwnd, 0, nil, PChar(UpperCase(ButtonName))); if ButtonHwnd = 0 then Exit; //bouton introuvable.. SendMessage(ButtonHwnd, BM_CLICK, 0, 0); //on clique dessus Result := True; //resultat ok! end; end; procedure TMain_Form.CmdButtonClick(Sender: TObject); var Result : boolean; begin Result := ClickOnTargetBtn(NomWin.Text, NomBtn.Text); end; procedure TMain_Form.BFermerClick(Sender: TObject); begin Application.Terminate; end;
@+,
Cincap
Euh, si les deux applications sont de se conception, autant modifier la 1ere ? que d'en pondre une seconde pour altérer la 1ère ?
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
@ ShaiLeTroll, pas nécessairement, dans mon cas, j'ai deux applications sur ma clé USB dont la 1ère que j'installe sur le pc, la 2ième reste sur ma clé USB et me permet d'avoir un contrôle sur le panneau "Options" qui est codé sur l'application installée et ce panneau "Options" n'est pas et ne doit pas être accessible sur cette application installée.
@+,
Cincap
bonjour ,
@ cincap,
salut mon vieux , j'espère que tu te portes bien.
malheureusement non, les deux applications ne sont pas de ma création.l'application que je veux contrôler c'est un logiciel(de gestion) que j'ai installé sur mon pc.tu pourrais peut-être t'orienter vers la propriété "tag" du "Tbutton" à condition que les deux applications soient de ta création.
je veux programmer une application qui désactive un bouton après 3 cliques dessus. je sais bien qu'il faut avoir le handle de la fenêtre principale et puis et le handle de la fiche enfant(child) et le handle du bouton que je veux désactiver,mais comment?
@ShaiLeTroll,salut,
comment désactiver un bouton d'une application extérieure?
Merci d'avance.
A+
NABIL74
Si tu possède la handle du bouton...
ceci devrait faire l'affaire...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 BOOL EnableWindow( HWND hWnd, // handle to window BOOL bEnable // flag for enabling or disabling input );
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
Merci Eric, j'avais déjà proposé cela !
Le Problème n'est pas de changer le Enabled c'est de détecter le nombre de clic dans l'application externe !
@cincap,
Ce n'est pas l'idée d'interaction entre appli que je discutais, je l'ai fait souvent entre un Service, un Application Admin\Client et un Notify
Le Fait de ne pas installer l'application d'admin me semble même très bien !
A L'école, les admins réseaux supprimaient les CPL du Panneau de Config, super sécurité pour des étudiants en informatique, on ramenait sur une disquette (oui c'était il y a 10 ans) les CPL nécessaires !
C'est que pour le cas énoncé, il n'y a pas d'intérêt d'avoir deux applis, je ne pense pas qu'il aurait eu de problème pour le développer tout seul dans ce cas.
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
Désolé...j'avais manqué la détection du nombre de click...
Faudrait alors passer par un hook sur la queue de message de l'application...
SetWindowsHookEx avec WH_GETMESSAGE...
on fournit une fonction callback GetMsgProc...
le tout dans une dll.
Puisqu'on connait le handle du boutton, il y aurait moyen de conter les 3 clicks...
ça reste quand même chaud à écrire....
j'ai peut-être un bout de code quelque part...
un keyboard et/ou mouse hook dans une dll...
faudrait la remanier dans votre but.
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
Moi, je l'ai pour fait WM_PAINT, on doit pouvoir le modifier pour WM_MBUTTONDOWN \WM_MBUTTONUP
Je pensais bien aussi que le Hook sur les messages était l'une des premiers solutions
Attendons que NABIL74 revienne !
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
46
47
48
49
50
51
52 library DLLTest; uses Windows, Messages; {$R *.res} 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; exports StartPaintHook, StopPaintHook; begin 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
salut,
merci à tous.
@Eric Boisvert,
oui je vais me pencher pour cette solution car je crois que c'est la solution à mon problème.Faudrait alors passer par un hook sur la queue de message de l'application...
SetWindowsHookEx avec WH_GETMESSAGE...
@ notre ami ShaiLeTroll,
j'ai réussi à avoir le handle de la fenêtre mais pas pour le handle du bouton!
comme je n'ai pas travaillé avec les handles, j'ai beaucoup de difficultés...
je testerai ton code ce soir et je te tiendrai au courant.
je penser à la solution que vous m'avez proposée :
Hook Système pour le nombre de click et puis désactiver le bouton avec "SendMessage" avec le message "MF_ENABLED" non?
autre question: comment savoir si on a cliqué sur le boutton en question?
a+
NABIL74
@ Nabil74, l'exemple que je t'ai donné fonctionne bien entendu avec toutes les applications Windows.
Pour un test, dans le TEdit nommé "NomWin.text" tapes calculatrice et dans le Tedit nommé Nombtn.text tapes "hyp" en mode scientifique et tu constateras que tu as bien checké le bouton "hyp" de la calculatrice.
Tu dois ouvrir la calculatrice avant de la piloter bien entendu.
Pour le reste, comme on te l'a suggéré.
@+,
Cincap
re,
merci cincap pour ta solution, je l'ai testée et ça fonctionne à merveille mais pour le reste comme tu le dis, c'est pas si simple que ça .
peut-être tu n'as pas bien saisie ce que je veux:
je veux faire une application sous delphi(qui reste en arrière plan :invisible) et de là je contrôle si on a cliqué 3 fois sur le bouton d'une application extérieure. si c'est = à 3 fois alors on le désactive définitivement(même au prochain lancement de cette application extérieure.
A+
NABIL74
@ Nabil74, si j'ai bien compris, regarde ce lien, il y a des idées :
http://alphomega.developpez.com/EchangeVal/
@+,
Cincap
Euh non, utilise EnableWindow, c'est ce que je t'ai proposé dès ma 1ère réponse, c'est une API qui le fera très bien !
Pour le Bouton, regarde "Window Spy" sur Phidels ou lance la DLL dont j'ai fourni le code, tu verras cela indique la classe des controls qui se dessine (j'ai très mal codé tout ça, ça rame un peu)
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
@ Nabil74, encore un lien qui me semble intéressant :
http://www.developpez.net/forums/d28...-applications/
@+,
Cincap
bonjour à tous et à toutes,
@ ShaiLeTroll,merci encore,
j'ai testé ton code et je vois qu'il donne la classe de chaque composant situé sur l'écran(c'est mieux que Windows Spy).Pour un début,c'est bien mais ça reste insuffisant.une suite à notre problème?
je te dis franchement, je me perds dans tout ça!
@ cincap,merci mon frère pour tout,je testerai ça ce soir.
Juste une question:
- est-il possible de lancer une fiche(une form) d'une application extérieure à partir de notre application ?
merci.
a+
NABIL74
Lancer une Fiche n'est pas possible si tu n'as pas d'API lié au controle de cette application
Par contre, tu peux simuler un Clic qui lui pourra lancer la fiche, sur un bouton c'est assez facile, sur un Menu, ça se corse !
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
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