Sendmesage Postmessage

POURMONET Messages postés 12 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 22 août 2012 - 22 nov. 2008 à 11:43
POURMONET Messages postés 12 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 22 août 2012 - 26 nov. 2008 à 22:15
Bonjour,
ça coince. Je dois être un peu neuneu, mais ce bout de code ne fonctionne pas.
j'ai une application qui tourne, elle s'appelle "Identification", je veux lui envoyer un message à afficher dans un textbox à partir d'un autre programme.
le code est simple :

'envoyer un message sur mon appli
nom_fenetre = "Identifiant"
Handle = cherche_fenetre(vbNullString, nom_fenetre)
Handle = GetWindow(Handle, 5)  'se placer dans la fenetre du texte
txt = "BONJOUR"
For num = 1 To Len(txt)
    lettre = Asc(Mid(txt, num, 1))
    PostMessage Handle, WM_KEYDOWN, lettre, 0
    PostMessage Handle, WM_KEYUP, lettre, 0
Next

Et bien ça marche pas.
Les fonctions Tab ou Close passent bien, mais ce message ne s"affiche pas.

j'ai du rater quelque chose, mais je ne sais pas ou !!!
si quelqu'un a une idée, je le remercie par avance.

Patrick

14 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
22 nov. 2008 à 16:27
salut,

pas besoin de boucler...

en plus ici tu n'envoies pas la lettre mais son code ascii, et n'ayant pas tes déclarations sous les yeux, moins facile...
et "
cherche_fenetre
" n'est pas un nom d'API normal...

Private Const WM_SETTEXT    As Long = &HC&
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long

SendMessage

Handle

, WM_SETTEXT, ByVal 0&, ByVal

"BONJOUR"



<hr size ="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
POURMONET Messages postés 12 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 22 août 2012
22 nov. 2008 à 18:12
Bonsoir,
Cherche_fenetre c'était juste pour montrer à un ami que l'on pouvait modifier le nom d'une fonction API.
ceci dit, WM-SETTEXT marche trés bien, toutefois il n'affiche pas le texte dans la bonne textbox, mais toujours dans le même bouton de la fenêtre.

comment faire pour afficher dans le bon champ de saisie ?
j'ai essayé la touche tab, le focus change bien mais le text est toujours saisie dans le même controle.

nom_fenetre = "Identifiant"
Handle = FindWindow(vbNullString, nom_fenetre)
Handle = GetWindow(Handle, 5)  'se placer dans la fenetre du texte

TxT$ = "BONSOIRkjhk"

PostMessage Handle, WM_KEYDOWN, VK_TAB, 0 'enter

SendMessage Handle, WM_SETTEXT, ByVal 0&, ByVal TxT$

merci pour ton aide

patrick
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
22 nov. 2008 à 18:37
à toi d'avoir le bon handle....
tu as mis
Handle = GetWindow(Handle, 5)  'se placer dans la fenetre du texte
, ce "choix" sort d'où ?

ps : ami ou pas, quel intérêt de changer les noms?


Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
POURMONET Messages postés 12 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 22 août 2012
22 nov. 2008 à 19:30
Cela me permet de sélectionner une fenêtre du programme hôte.
Si je ne met pas GetWindows, le message apparait dans le titre de la fenêtre.
Si je le laisse, le message apparait dans le bouton OK
J'ai essayé d'autres code que le 5, mais cela ne donne rien.

je n'arrive pas à envoyer mon message dans la textbox.

Le problème est que je n'ai pas pu trouvé d'explication claire sur ces fonctions.
J'avance à TATON.
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
22 nov. 2008 à 22:08
à tatons ok mais là c'est pire que du pifomètre..., tu utilises une API sans lire à quoi elle sert...

The GetWindow function retrieves the handle of a window that has the specified relationship (Z order or owner) to the specified window.
5 c'est GW_CHILD

avoir la class "enfant" c'est bien beau, mais il y a plusieurs contrôles sur ce "niveau"....
des "button", des "edit", etc.....

si tu prends le premier venu forcément tu as le premier venu!

soit tu gardes cette méthode et dans ce cas il te faut aussi jouer avec GetClassName et de nouveau

GetWindow

avec le flag GW_HWNDNEXT, soit tu joues avec FindWindowEx

tout çà, par chance, est documenté :
http://msdn.microsoft.com/fr-fr/library/default.aspx

le mieux étant au moins de savoir ce qu'on cherche, en l'occurence d'aller "lire" le bon handle visuellement, avec Spy++, puis de commencer les tests (sendmessage) seulement quand on a trouvé le même handle

bon courage


Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
POURMONET Messages postés 12 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 22 août 2012
23 nov. 2008 à 01:04
Hello,
j'ai TATE pendant un bon moment, mais ça marche avec FindWindowsEx.
Pas facile de trouver les réponses à des questions aussi précises.

Merci pour ton aide et bonne nuit.

Patrick
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
23 nov. 2008 à 01:18
pense à valider la ou les bonnes réponses dans ce cas
bonne continuation
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 nov. 2008 à 08:36
une fois la fenetre parent trouvée, tu peux jouer avec l'ID du controle ciblé.

Private Declare Function GetDlgItem Lib "user32.dll" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long

lances Spy++ pour connaitre l'ID du textbox dont tu cherches le handle
0
johnnous Messages postés 100 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 24 mai 2013
25 nov. 2008 à 17:04
salut tu pourrais m'evoyer tes sources

merci
Jean louis
0
POURMONET Messages postés 12 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 22 août 2012
25 nov. 2008 à 22:35
il s'agit d'un code de debuggage, il fonctionne mais doit être terminé pour être utilisé proprement.
Bon courage
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long

Const VK_RETURN = &HD
Const VK_TAB = &H9
Const WM_KEYDOWN = &H100
Const WM_KEYUP = &H101
Const WM_SETTEXT    As Long = &HC&

Dim HandleFen(10)

'utiliser pour ce test une fenetre avec la saisie d'un id et pw
'1 récupérer le handle de la fenetre par son titre
nom_fenetre = "Identifiant"
Handle = FindWindow(vbNullString, nom_fenetre)

'2 récupérer les noms de class de toutes les fenetres filles
Do
    cwnd = FindWindowEx(Handle, cwnd, vbNullString, vbNullString)
    If cwnd = 0 Then Exit Do
    i = i + 1
    HandleFen(i) = cwnd
    Debug.Print "Child sibling handle: " & cwnd
Loop
'afficher toutes les sous fenêtres pour comprendre
For i = 1 To 4
    Debug.Print "Handle " & i & " = " & HandleFen(i)
Next
'afficher les noms
Debug.Print "ID " & HandleFen(4) & " - " & Hex(HandleFen(4))
Debug.Print "PW " & HandleFen(3) & " - " & Hex(HandleFen(3))

'étudier l'ordre avec Spy++ ou par test
'dans ce cas le text box 4 est l'ID
TXT$ = TXT1
SendMessage HandleFen(4), WM_SETTEXT, ByVal 0&, ByVal TXT$
'dans ce cas le textbox 3 est le password
TXT$ = PW
SendMessage HandleFen(3), WM_SETTEXT, ByVal 0&, ByVal TXT$

'cette fonction ne marche pas encore
'PostMessage HandleFen(1), WM_KEYDOWN, VK_RETURN, 0

'remplacée par
PostMessage Handle, WM_KEYDOWN, VK_TAB, 0 'enter
PostMessage Handle, WM_KEYDOWN, VK_TAB, 0 'enter
PostMessage Handle, WM_KEYDOWN, VK_RETURN, 0 'enter

SetForegroundWindow (Handle)
0
johnnous Messages postés 100 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 24 mai 2013
26 nov. 2008 à 08:46
merci
j'essais ca

Jean louis
0
johnnous Messages postés 100 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 24 mai 2013
26 nov. 2008 à 09:26
ca marche par contre je ne comprends pas bien la fin
'cette fonction ne marche pas encore
'PostMessage HandleFen(1), WM_KEYDOWN, VK_RETURN, 0

'remplacée par
PostMessage Handle, WM_KEYDOWN, VK_TAB, 0 'enter
PostMessage Handle, WM_KEYDOWN, VK_TAB, 0 'enter
PostMessage Handle, WM_KEYDOWN, VK_RETURN, 0 'enter

SetForegroundWindow (Handle)

tu peux m'expliquer
merci encore

Jean louis
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 nov. 2008 à 22:05
voir MSDN

tu presses deux fois tab, puis entrée
ensuite, tu active la fenetre (focus)
0
POURMONET Messages postés 12 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 22 août 2012
26 nov. 2008 à 22:15
Et voila, merci Renfield pour l'explication, je ne peux pas répondre trés rapidement, je suis en rupture d'ADSL au bureau (changement de provider)

en gros, j'ai choisi cette solution parce que la précédente

PostMessage HandleFen(1), WM_KEYDOWN, VK_RETURN, 0

ne fonctionne pas encore, ça va venir quant j'aurai 5mn pour m'en occuper.



bonne soirée
0
Rejoignez-nous