Trainkill666
Messages postés52Date d'inscriptionvendredi 25 octobre 2002StatutMembreDernière intervention 5 mai 2008
-
20 avril 2006 à 12:00
Trainkill666
Messages postés52Date d'inscriptionvendredi 25 octobre 2002StatutMembreDerniè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 ...
A voir également:
Clic bouton prgramme qui n'est pas en premier plan
'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
Trainkill666
Messages postés52Date d'inscriptionvendredi 25 octobre 2002StatutMembreDerniè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...
Trainkill666
Messages postés52Date d'inscriptionvendredi 25 octobre 2002StatutMembreDerniè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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Trainkill666
Messages postés52Date d'inscriptionvendredi 25 octobre 2002StatutMembreDerniè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.
@+