Clic bouton prgramme qui n'est pas en premier plan [Résolu]

Messages postés
52
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
5 mai 2008
- - Dernière réponse : Trainkill666
Messages postés
52
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
5 mai 2008
- 25 avril 2006 à 15:12
Salut,
j'ai un programme qui lance le cpl de nview shell "control.exe ...cpl" (nvidia) pour cliquer sur le bouton activer ou désactiver (c'est le meme bouton).
Ensuite le programme simule l'appui sur la touche entrée par keybd event.
C'est une solution provisoire, en effet, quand la fenetre n'est pas en premier plan, l'appui n'est pas validé, et le alt f4 pour fermer ne fonctionne pas.
Je voudrais trouver une solution pour lancer ce programme (je peux connaitre son hwnd) et cliquer sur ce bouton sans qu'il soit en premier plan : j'ai vu sur sbfrance un code, que je ne retrouve plus, qui le permet.
Aidez moi svp,
Merci d'avance ...
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
29
3
Merci
salut,
bon, voici une base qui à me semble correcte...

une première application VB6 (pour test) contenant 2txtbox et un bouton :

Option Explicit
'
Private Sub Form_Load()
Me.Show
Me.Caption = "Application nvidia"
Command1.Caption = "Bouton nvidia"
Text1.Text = Me.hWnd
Text2.Text = Command1.hWnd
End Sub
'
Private Sub Command1_Click()
MsgBox "Action nvidia"
End Sub


<small> Coloration
syntaxique automatique [AFCK] </small>


et une 2e sans composant :



'in a form
Private Sub Form_Load()
'KPD-Team 2000
Me.AutoRedraw = True
EnumChildWindows GetDesktopWindow, AddressOf EnumChildProc, ByVal 0&
End Sub

'in a module
Declare Function GetDesktopWindow Lib "user32" () As Long
'
Declare Function EnumChildWindows Lib "user32" _
(ByVal hWndParent As Long, ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
'
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long
'
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" _
(ByVal hwnd As Long) As Long
'
'
Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim sSave As String
'Get the windowtext length
sSave = Space$(GetWindowTextLength(hwnd) + 1)
'get the window text
lH = GetWindowText(hwnd, sSave, Len (sSave))
'remove the last Chr$(0)
sSave = Left$(sSave, Len(sSave) - 1)
If (sSave "Application nvidia") Or (sSave "Bouton nvidia") Then
Form1.Print hwnd & vbTab & sSave
End If

'continue enumeration
EnumChildProc = 1
End Function


<small> Coloration
syntaxique automatique [AFCK]</small>


++
PCPT [AFCK]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 197 internautes nous ont dit merci ce mois-ci

Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
29
0
Merci
salut
api SendMessage

pour le bouton il faut trouver le handle du bouton et envoyer WM_LBUTTONDOWN or WM_LBUTTONUP (à tester)

et pour fermer, WM_CLOSE au handle de l'appli
++
Messages postés
52
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
5 mai 2008
0
Merci
Merci PCPT,
ça marche nickel (sur d'autres fenetres),
Probleme 1 : quand je lance avec le shell "control.exe ?.cpl", il me met 0 en handle avec findwindow quand ces instructions sont dans la meme application vb : Résolu en partie en fintant.
Probleme 2 majeur : impossible d'obtenir le handle du bouton :
Il s'agit du bouton activer/desactiver du cpl de nividia (dans panneau de configuration.
J'arrive à obtenir l'handle du cpl avec findwindow,
l'handle de la frame du bouton avec getwindowtext (en trichant avec la source 6844),
mais impossible pour le bouton.
J'ai tenté avec getclassName mais je ne sais pas l'utiliser pour obtenir l'handle du bouton.
Je suis un peu perdu.
Aidez moi svp,
merci d'avance...
Messages postés
52
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
5 mai 2008
0
Merci
Merci PCPT,
ton exemple fonctionne nickel avec plein de programmes,
j'ai acces facilement au boutons de Nview Desktop Manager,
sauf le bouton activé/désactivé qui est, semble-t'il, dans une frame ou un truc du genre (bizarre j'ai essayé en vb6 de mettre un bouton dans une frame et ton exemple fonctionne pourtant).
Mais ça, tu ne pouvais pas le savoir,
Je me pose des questions, je vais faire une recherche pour savoir comment fonctionne ce fameux bouton et pourquoi sont handle et si dur à obtenir, ou trouver une autre solution pour activer le nview sans passer par ce fameux cpl.
Un grand merci pour ton exemple, ainsi que WM_BUTTON... et WM_CLOSE, c'est tres pratique à utilisé.
Bye
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
29
0
Merci
peut-être que ton "bouton dans la frame" n'est qu'un label...
Messages postés
52
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
5 mai 2008
0
Merci
Salut,
J'ai trouvé la solution, c'etait tout simple en fait,
je complete ton code avec ça :
nviewhandle etant le handle de la frame qui contient le fameux bouton.
'déclaration
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WM_KEYDOWN As Integer = &H100
Public Const WM_KEYUP As Integer = &H101
'dans le code
KeyCode = 13 'touche entrée, eh oui, le clic sur le bouton ne fontionne pas mais un clic sur entrée apres avoir ciblé la zone fonctionne tres bien,
PostMessage nviewhandle, WM_KEYDOWN, KeyCode, ByVal 0
PostMessage nviewhandle, WM_KEYUP, KeyCode, ByVal 0

puis j'utilise de nouveau ton code pour cliquer sur la touche "ok"
et voila
encore merci, tu m'as fait le plus dur du travail.
@+