Clic bouton prgramme qui n'est pas en premier plan

Résolu
Trainkill666 Messages postés 52 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 5 mai 2008 - 20 avril 2006 à 12:00
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 ...

6 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 avril 2006 à 09:23
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]
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
20 avril 2006 à 20:35
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
++
0
Trainkill666 Messages postés 52 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 5 mai 2008
21 avril 2006 à 02:22
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...
0
Trainkill666 Messages postés 52 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 5 mai 2008
21 avril 2006 à 21:41
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 avril 2006 à 22:15
peut-être que ton "bouton dans la frame" n'est qu'un label...
0
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 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.
@+
0
Rejoignez-nous