cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 2018
-
23 janv. 2010 à 13:32
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011
-
29 juin 2011 à 20:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 29 juin 2011 à 20:47
Pourquoi ce code ne marche pas? (ni avec WORD,EXCEL alors que c'est ok avec NOTEPAD).Aucune erreur se produit, l'appli en question s'ouvre et passe au premier plan, puis c'est tout.
Merci pour une reponse
Private Sub Form_Click()
Dim h As Long, retval As Long, h2 As Long, h3 As Long
Dim posit As Long
retval = Shell("C:\Program Files\OpenOffice.org 3\program\swriter.exe", vbNormalNoFocus)
h = FindWindow("SALFRAME", "Sans nom 1 - OpenOffice.org Writer")
If preplan Then
lgConst = HWND_TOPMOST
Else
lgConst = HWND_NOTOPMOST
End If
posit = SetWindowPos(h, lgConst, 10, 10, 400, 400, &H100)
AppActivate "Sans nom 1 - OpenOffice.org Writer"
SetForegroundWindow (h)
' on active le premier element de la Barre de menus pour cela on simule "Alt"
PostMessage h, WM_KEYDOWN, VK_MENU, 0
PostMessage h, WM_KEYUP, VK_MENU, 0
' on simule la fleche vers la droite pour se deplacer dans le menu
PostMessage h, WM_KEYDOWN, VK_RIGHT, 0 'touche enfoncee
PostMessage h, WM_KEYUP, VK_RIGHT, 0 'touche relevee
'on simule la fleche vers le bas pour derouler le menu selectionne
PostMessage h, WM_KEYDOWN, VK_DOWN, 0
PostMessage h, WM_KEYUP, VK_DOWN, 0
'on simule la touche entree pour afficher la boite de dialogue
PostMessage h, WM_KEYDOWN, VK_RETURN, 0
PostMessage h, WM_KEYUP, VK_RETURN, 0
Exit Sub
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 23 juin 2011 à 13:19
Tout à fait d'accord, je connais bien l'Automation, mais mon but final est de piloter framemaker (car pour des operations precises il faut manipuler un grand nombre de selections) et là l'automation est tres reduite; et cela ne m'explique pas pourquoi postmessage ou senmessage ne fonctionnent pas alors que spy enregistre bien les commandes avec des item menu.(valable pour open office..?)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 23 juin 2011 à 09:58
Pour piloter Word et Excel, possible de passer par l'Automation (Comme VBA)
GetObject(,"Word.Application")
etc.
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 22 juin 2011 à 20:05
Bonjour
Enfin sur la base de ton code j'arrive à piloter et meme modifier wordpad ou notepad, parcontre d'autres appli comme word,excel, writer,framemaker cela ne marche pas. SPY ne voit pas les commandes WM_COMMAND, il envoi des WM_SYSKKEYDONW,WM_SYSKEYUP .....Je n'arrive pas à reproduire ces commandes sous vb, rien ne marche.
Si tu as une idée cela m'aiderais bien
Merci
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 20 juin 2011 à 16:13
Bonjour,
Je precise mon pb:avec la cde 'sendmessage wm_command,2,0& ' j'ouvre bien la boite de dialogue fichier, mais ensuite mon progr vb perd la main car c'est une boite modale, donc toutes mes commandes suivantes ne sont pas executées tant que la boîte est ouverte.Or je veux remplir avec vb la zone de texte du 'nom de fichier' (en fait je voudrais piloter complètement les menus de notepad.Merci pour une bonne idée
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 17 juin 2011 à 17:30
Bonjour,
Merci pour ta reponse, grace à toi sur le modele de ton code je parviens à ouvrir le menu fichier de notepad. Mais je n'arrive pas à obtenir le handle de la zone de saisie du nom de fichier à ouvrir (avec spi j'ai la classe mais c'est la meme que la zone d'ecriture alors comment faire). Dautre part il y a t il un moyen de simuler des combinaisons de touches.
Merci si tu as compris ce que JE demande et si tu as une idee.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 16 juin 2011 à 09:59
"j'ai du copier..."
le code est effectivement dans un module (voir le .Zip)
pour l'ID, c'est avec Spy++ (voir .doc dans le zip)
pour ton handle, a voir s'il ne faut pas attendre que le process en face soit lancé (WaitForInputIdle)
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 15 juin 2011 à 17:49
Bonjour et merci pour ce code
J'ai testé et pour que cela marche j'ai du coller toutes les functions et les declarations api dans un module, cela marche donc tres bien avec la calculatrice. Maintenant je fais un test avec open writer qui s'ouvre bien avec la commande shell, je recupère bien le handle mais le lParam est toujours <> du nPID, donc message "Fenêtre pas trouvée".
Autre question comment trouver la bonne valeur numerique 304 dans ce code pour ouvrir le bon menu SendMessage hMainWnd, WM_COMMAND, 304, ByVal 0&
Bon but etant de piloter des appli comme FrameMaker avec vb
Meri pour ta reponse
PTARD
Runs59
Messages postés2Date d'inscriptionmardi 12 mai 2009StatutMembreDernière intervention 1 octobre 2010 14 mars 2011 à 11:26
Superbe ! Ca fait 2 jours que je planche dessus et tu me débloques !
Merci de mettre à disposition ce savoir.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 3 juin 2010 à 20:58
le programme a été recode...
les ID des touches ne collent certainement pas.
tu as la méthode dans le cours, tu dois pourvoir faire le nécessaire ^^
non ??
olivbout
Messages postés7Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention 3 février 2013 3 juin 2010 à 17:39
Problème sur mon poste sous Windows 7, la calculette se lance mais rien d'autre ne se passe, les commandes semblent ignorées... sais tu pourquoi?
olivbout
Messages postés7Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention 3 février 2013 28 mai 2010 à 13:31
Ok super merci ca marche maintenant
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 28 mai 2010 à 12:18
Il faut qu'elle soit publique:
Public Sub Main
olivbout
Messages postés7Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention 3 février 2013 28 mai 2010 à 09:36
Et bien en fait j'ai fait un copier coller dans le code de ma form et créé un bouton qui appel la fonction main.... mais ca ne marche pas.
Suivant tes conseils j'ai mis ton fichier ModMain.bas dans un "modules" mais la je n'arrive pas à lancer la procedure main...
Merci de ton aide.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 28 mai 2010 à 07:21
ta EnumWindowsProc est bien place dans un module .bas ?
olivbout
Messages postés7Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention 3 février 2013 27 mai 2010 à 23:58
Bonjour,
pourquoi ca ne marche pas chez moi???
J'ai une erreur: dans la fonction:
Private Function GetWndFromProcessID(ByVal vnPID As Long) As Long
EnumWindows AddressOf EnumWindowsProc, vnPID
GetWndFromProcessID = mhFoundWnd
End Function
il me met:
Invalid use of AdressOf operator !!!!
J'ai essayé en vb6 e vba excel mais c'est la même chose.
Merci de votre aide et bravo pour le travail.
nicolasq150784
Messages postés51Date d'inscriptionmercredi 24 juin 2009StatutMembreDernière intervention23 avril 2010 18 mars 2010 à 23:24
ok merci pour l'info
c'est bon a savoir ça
merci merci ^_^
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 18 mars 2010 à 23:17
une boucle Do While ... Loop
n'est pas une bonne chose si le temps de traitement est incertain (boucle sans fin ?)
il faut relacher un peu le processeur et redonner la main a Windows.
DoEvents permet de redonner la main a l'interface pour montrer a windows que ton appli est pas crashée...
tu sais, parfois, ca indique "(ne réponds pas)" dans la barre de titre de certaines applis...
...
nicolasq150784
Messages postés51Date d'inscriptionmercredi 24 juin 2009StatutMembreDernière intervention23 avril 2010 18 mars 2010 à 22:51
ok merci j'ai fait autremet mais il faudra que je me repenche la dessus
ça m'agase de pas y arriver
juste une dernier histoire de
Application.DoEvents()
ça sert a quoi exactement ?
En tout cas encore 1000 merci
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 18 mars 2010 à 21:49
c'est idem, le tout est de se raccrocher au IE.Document
mais oublie ce genre de boucles :
For Each ElementHtml As HtmlElement In LaPage
nicolasq150784
Messages postés51Date d'inscriptionmercredi 24 juin 2009StatutMembreDernière intervention23 avril 2010 18 mars 2010 à 21:32
Application.DoEvents()
je connais pas ça...
alors merci merci merci beaucoup
mais je n'est pas de webbrower
moi je voudrais que ce soit avec Internet Explorer
bon c'est pas grave
merci merci encore
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 18 mars 2010 à 21:04
et voilà ^^
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
WebBrowser1.Navigate("http://www.facebook.com")
Do
Application.DoEvents()
Loop Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
WebBrowser1.Document.GetElementById("email").SetAttribute("value", TextBox1.Text)
WebBrowser1.Document.GetElementById("pass").SetAttribute("value", TextBox2.Text)
WebBrowser1.Document.GetElementById("login_form").InvokeMember("submit")
End Sub
le code de ce matin a été fait de tête... du coup c'etait de l'a peu pres
là c'est testé etc.
c'est fait sous Visual Studio (2005)
nicolasq150784
Messages postés51Date d'inscriptionmercredi 24 juin 2009StatutMembreDernière intervention23 avril 2010 18 mars 2010 à 20:28
Marche pas non plus
Dim IE As New InternetExplorer
Dim LaPage As HTMLElementCollection
ie = New InternetExplorer
ie = CreateObject("InternetExplorer.Application")
IE.Navigate("www.facebook.com")
IE.Visible = True
Do While IE.ReadyState <> tagREADYSTATE.READYSTATE_COMPLETE
Loop
LaPage = IE.Document
Try
For Each ElementHtml As HtmlElement In LaPage
ElementHtml.Document.GetElementById("email").InnerHtml = "monemail@societe.com"
ElementHtml.Document.GetElementById("password").InnerHtml = "abracadabra"
ElementHtml.Document.InvokeScript("click")
Next
Catch
MsgBox("Erreur")
End Try
nicolasq150784
Messages postés51Date d'inscriptionmercredi 24 juin 2009StatutMembreDernière intervention23 avril 2010 18 mars 2010 à 20:05
ça crée une erreur
nicolasq150784
Messages postés51Date d'inscriptionmercredi 24 juin 2009StatutMembreDernière intervention23 avril 2010 18 mars 2010 à 19:28
merci
Ah ! je suis vraiment desolé
mais ça marche pas:
Dim IE As New InternetExplorer
IE = New InternetExplorer
IE.Visible = True
IE.Navigate("www.facebook.com")
If IE.ReadyState = tagREADYSTATE.READYSTATE_COMPLETE Then
IE.Document.GetElementByID("email").Value = "monemail@societe.com"
IE.Document.GetElementByID("password").Value = "abracadabra"
IE.Document.GetElementByID("login_form").submit
End If
:[ Help me please !
En tout cas merci merci beaucoup de repondre a tout mes messages :]
nicolasq150784
Messages postés51Date d'inscriptionmercredi 24 juin 2009StatutMembreDernière intervention23 avril 2010 17 mars 2010 à 19:53
ps: je suis sur Visual Basic 2008 Express
nicolasq150784
Messages postés51Date d'inscriptionmercredi 24 juin 2009StatutMembreDernière intervention23 avril 2010 17 mars 2010 à 19:52
oui j'ai deja telechargé
mais ça marche pas !
je vais expliquer mon truc, enfin essayer, c'est tout bete mais ....
je voudrais que :
quand je clic sur un bouton ça m'ouvre une page Internet Explorer direct sur le site que je veux et que ça me connecte tout seul
Par exemple:
je clic sur le bouton et Facebook s'ouvre et active mon compte tout seul.
Voila je sais ça doit etre tout bete mais j'avoue que je galere ...
merci de m'aider pour ça deja
voila ce que j'ai deja essayé:
Dim ie As New InternetExplorer
ie = New InternetExplorer
ie.Navigate2("www.facebook.com")
'ie.Visible = True
'Dim theElementCollection As HTMLElementCollection
'theElementCollection = ie.Document.GetElementsByTagName("input")
'For Each curElement As HtmlElement In theElementCollection
' Dim controlName As String = curElement.GetAttribute("name").ToString
' If controlName = "produit_nom" Then
' curElement.SetAttribute("Value", SnomTextBox.Text.ToString)
'
' End If
'Next
'theElementCollection = ie.Document.GetElementsByTagName("input")
'For Each curElement As HtmlElement In theElementCollection
' If curElement.GetAttribute("value").Equals("Ok") Then
' curElement.InvokeMember("click")
'
' End If
'Next
je sais pas ce que ça vaut
merci merci .
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 17 mars 2010 à 05:46
nicolasq150784
Messages postés51Date d'inscriptionmercredi 24 juin 2009StatutMembreDernière intervention23 avril 2010 17 mars 2010 à 00:37
MSN j'arrive a faire 2 ou 3 truc
mais internet explorer lui par contre oula !
J'arrive meme pas a me connecter automatiquement a facebook.
Comment on fait juste ça deja ?
Si vous avez un site ou un tuto pour le pilotage de IE et Excel, c'est eu qui m'interressent le plus pour le moment.
Merci d'avance et merci d'avoir repondu ;)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 16 mars 2010 à 22:25
Outlook, Excel et Word, déjà, c'est simple, ils sont entièrement pilotables depuis longtemps, via COM (et l'Interop, dans ton cas).
creuse un peu du coté des Excel.Application, etc
pour IE, il est possible de manipuler la page via le DOM
MSN, lui, propose certaines API et un activeX, me semble, également.
si y'a des questions plus précises...
n'hésites pas
nicolasq150784
Messages postés51Date d'inscriptionmercredi 24 juin 2009StatutMembreDernière intervention23 avril 2010 16 mars 2010 à 22:15
salut cool ce petit pilotage.
Moi j'apprend tout juste avec vb2008.
C'est pour ça que le phrase de Renfield, je cite :
"Ravi de voir que ca sert, et que le niveau pédagogique vous convient.
Si vous souhaitez d'autres exemples particuliers, n'hésitez pas à m'en faire part"
m'a interpellé ;)
Voila je voudrais apprendre a piloter plusieurs application Windows.
- Internet Explorer
- MSN
- Outlook
- Excel
- Word
- ...
Voila donc si vous avez des codes source, des liens de site qui propose des codes source merci hésitez pas
Merci beaucoup d'avance
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 21 févr. 2010 à 22:15
dur de dire sans visu live, désolé
media6
Messages postés51Date d'inscriptionmercredi 29 septembre 2004StatutMembreDernière intervention 7 juillet 2010 21 févr. 2010 à 19:53
Bonsoir,
Je suis toujours bloqué avec mon problème de fenêtre modale.
Je n'ai aucun contrôle dessus même avec postmessage.
J'ai beau lancer des postmessage (au lieu de sendmessage), ils doivent rester dans la file d'attente des messages de la fenêtre modale...
Renfield, tu as sûrement la solution !!!
jocou
Messages postés52Date d'inscriptionlundi 5 janvier 2004StatutMembreDernière intervention19 novembre 2013 15 févr. 2010 à 17:49
La solution MSAA fonctionne parfaitement, et j'ai bien accès au DOM de la page WEB qui m'interesse.
Mais pour piloter complètement l'appli, il faut que j'aille plus loin et que je puisse récupérer les évènements (en particulier le document_complete après un submit par ex.)
Et là, je ne vois pas très bien comment faire...
Sniff...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 11 févr. 2010 à 14:07
If the button is in a dialog box and the dialog box is not active, the BM_CLICK message might fail. To ensure success in this situation, call the SetActiveWindow function to activate the dialog box before sending the BM_CLICK message to the button.
media6
Messages postés51Date d'inscriptionmercredi 29 septembre 2004StatutMembreDernière intervention 7 juillet 2010 11 févr. 2010 à 12:40
Précision pour le message ci-dessus, c'est quand winspector donne :
Code: BN_CLICKED
Control ID: 1234
Control HWND: 0x00150A62
La commande est donc :
PostMessage CLng(&H150A62), BM_CLICK, 1234, ByVal 0& 'ou sendmessage
media6
Messages postés51Date d'inscriptionmercredi 29 septembre 2004StatutMembreDernière intervention 7 juillet 2010 11 févr. 2010 à 12:35
Merci pour ta réponse, j'ai déjà essayé mais ça ne fonctionne pas.
Je vais continuer mes tests !
en ayant bien sûr déclaré la constante :
Private Const BM_CLICK As Long = &HF5
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 11 févr. 2010 à 11:46
SendMessage attend que l'application ciblée réponde
voir PostMessage pour un retour immédiat
media6
Messages postés51Date d'inscriptionmercredi 29 septembre 2004StatutMembreDernière intervention 7 juillet 2010 11 févr. 2010 à 11:34
Après plusieurs tests, je me suis aperçu qu'en fait, le problème que je rencontre ne vient pas du bouton...
Je vais essayer de l'expliquer :
J'essaye de piloter une application métier qui s'appelle Alphacam.
Cette application est pilotable en VBA mais toutes les fonctions ne sont pas disponibles... (Zut !)
Tout d'abord, je trouve le hwnd de la fenêtre "Alphacam": ça fonctionne.
Puis je lance :
ret = SendMessage(hwndF, WM_COMMAND, 32839, ByVal 0&) '32839 est donné par winspector : ça fonctionne
MsgBox ret
Le problème est que je n'ai plus la main jusqu'à ce que la commande soit terminée manuellement dans Alphacam.
La commande 32839 affiche un bouton sur lequel je dois cliquer, puis cliquer sur la pièce affichée à l'écran, etc...
Mon msgbox s'affiche uniquement quand j'ai fini de faire tout ça à la main.
Je ne sais pas comment interagir avec Alphacam pour automatiser ces opérations.
Je voudrais pouvoir faire quelque chose du genre :
media6
Messages postés51Date d'inscriptionmercredi 29 septembre 2004StatutMembreDernière intervention 7 juillet 2010 10 févr. 2010 à 18:10
Super ! Impeccable.
Une petite question toutefois :
Quand on obtient ça avec Winspector, comment on le renvoie avec sendmessage :
Code: BN_CLICKED
Control ID: 1234
Control HWND: 0x00460336
J'ai essayé de le renvoyer avec BN_CLICKED et BM_CLICK mais il n'y a rien à faire.
Merci d'avance.
jocou
Messages postés52Date d'inscriptionlundi 5 janvier 2004StatutMembreDernière intervention19 novembre 2013 10 févr. 2010 à 11:59
A l'attention de MMATHIEUU :
Voici le code VB.Net qui t'interresse :
Dim shellWindows As SHDocVw.ShellWindows = New SHDocVw.ShellWindowsClass()
For Each oIE As SHDocVw.InternetExplorer In shellWindows
If TypeName(oIE.Document).ToString = "HTMLDocumentClass" Then
MsgBox(oIE.LocationURL)
End If
Next
mMathieuU
Messages postés13Date d'inscriptionjeudi 21 janvier 2010StatutMembreDernière intervention 9 février 2010 9 févr. 2010 à 08:52
Salut Jocou, si tu arrives à transposer en vb.net ça m'intéresserai de voir ton code. Merci
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 févr. 2010 à 05:40
bien que cela doive etre proche... je ne code pas en .Net ...
jocou
Messages postés52Date d'inscriptionlundi 5 janvier 2004StatutMembreDernière intervention19 novembre 2013 8 févr. 2010 à 18:11
Super, ca marche du tonnerre...
Mais j'ai du mal à transposer en VB.Net : j'arrive simplement à obtenir une liste de handles, mais pas une collection de fenêtres comme en VB6. Connais-tu une solution ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 8 févr. 2010 à 16:26
Il est possible d'énumerer les instances de IE et Explorer (même combat) présentes sur le poste.
ensuite, soit tu identifie la fenetre "souhaitée" en regardant le titre, l'url, le hWnd ...
utilises ce genre de boucle :
Dim oWindow
For Each oWindow In CreateObject("Shell.Application").Windows
If TypeName(oWindow.Document) = "HTMLDocument" Then
MsgBox oWindow.LocationURL
End If
Next
jocou
Messages postés52Date d'inscriptionlundi 5 janvier 2004StatutMembreDernière intervention19 novembre 2013 8 févr. 2010 à 16:13
Bravo pour le tutorial
J'ai cependant une question concernant le pilotage d'une appli WEB :
Comment faire pour piloter un IE déjà lancé sur le poste de travail et non pas une nouvelle instance créée dans le prog. de pilotage ?
Une petite suggestion pour finir : publier un tuto de la même qualité sur l'objet WinHttpRequest
Merci
mMathieuU
Messages postés13Date d'inscriptionjeudi 21 janvier 2010StatutMembreDernière intervention 9 février 2010 4 févr. 2010 à 14:19
Bon ba j'ai pas les sources au travail, j'essayerai chez moi ...
Merci
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 4 févr. 2010 à 14:07
comme dit plus haut :
"c'est du VB6.... faut le charger avec Visual Basic 6."
mMathieuU
Messages postés13Date d'inscriptionjeudi 21 janvier 2010StatutMembreDernière intervention 9 février 2010 4 févr. 2010 à 14:05
évidement ... faut que je prenne quoi comme logiciel ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 4 févr. 2010 à 14:00
non ^^
mMathieuU
Messages postés13Date d'inscriptionjeudi 21 janvier 2010StatutMembreDernière intervention 9 février 2010 4 févr. 2010 à 13:57
Visual studio 2005 gère pas le vb6 ?
mMathieuU
Messages postés13Date d'inscriptionjeudi 21 janvier 2010StatutMembreDernière intervention 9 février 2010 4 févr. 2010 à 11:41
ok je teste ça tout de suite, merci de ta réponse rapide.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 4 févr. 2010 à 11:40
c'est du VB6.... faut le charger avec Visual Basic 6.
je pense que tu as tenté de l'ouvrir sous Visual Studio (pour .Net)
mMathieuU
Messages postés13Date d'inscriptionjeudi 21 janvier 2010StatutMembreDernière intervention 9 février 2010 4 févr. 2010 à 11:37
Salut, je pense que ça vient de moi (ou plutôt de mon visual studio) mais ton code sources ne marche pas ... même en faisant un copier collé bête et méchant ... mais bon Visual Studio me repère pas mal d'erreur de syntaxe, je sais pas pourquoi .
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 26 janv. 2010 à 17:48
Ravi de voir que ca sert, et que le niveau pédagogique vous convient.
Si vous souhaitez d'autres exemples particuliers, n'hésitez pas à m'en faire part
mafieulemouton
Messages postés24Date d'inscriptionlundi 30 juin 2008StatutMembreDernière intervention26 janvier 2010 26 janv. 2010 à 16:43
Merci beaucoup! Pour moi qui débute c'est un vrai bonheur de trouver enfin quelques explications simples sur le contrôle d'application.
cs_Nectar108
Messages postés16Date d'inscriptionvendredi 5 mai 2006StatutMembreDernière intervention22 avril 2013 25 janv. 2010 à 03:00
Wow ! Super .... Bravo et gros merci pour ce tutoriel ! Il est simple, clair et facile à comprendre, un document de grande qualité (pour moi en tout cas !). Chapeau bas monsieur ! J'apprécie énormément ce genre de document. Cela fonctionne et donne un sérieux "coup de main" à qui veut avancer dans le domaine. Merci encore, et je vous encourage à en écrire d'autres comme celui-ci, voire à approfondir ce sujet. Super !
XelectroX
Messages postés209Date d'inscriptionsamedi 11 novembre 2000StatutMembreDernière intervention 6 novembre 2009 24 janv. 2010 à 20:11
Génial Merci !
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 23 janv. 2010 à 13:32
Un grand merci à toi, Renfield
Suite à ta réponse sur une question que j'avais posée concernant ce sujet, je n'ai jamais eu le temps de m'y mettre et de faire des tests. Mais là, j'ai une semaine de vacances et j'espère bien pouvoir y passer au moins une journée...
Je n'ai pas regardé encore les fichiers joints, mais je sens que ça va m'être bien utile... ;)
29 juin 2011 à 20:47
Merci pour une reponse
Private Sub Form_Click()
Dim h As Long, retval As Long, h2 As Long, h3 As Long
Dim posit As Long
retval = Shell("C:\Program Files\OpenOffice.org 3\program\swriter.exe", vbNormalNoFocus)
h = FindWindow("SALFRAME", "Sans nom 1 - OpenOffice.org Writer")
If preplan Then
lgConst = HWND_TOPMOST
Else
lgConst = HWND_NOTOPMOST
End If
posit = SetWindowPos(h, lgConst, 10, 10, 400, 400, &H100)
AppActivate "Sans nom 1 - OpenOffice.org Writer"
SetForegroundWindow (h)
' on active le premier element de la Barre de menus pour cela on simule "Alt"
PostMessage h, WM_KEYDOWN, VK_MENU, 0
PostMessage h, WM_KEYUP, VK_MENU, 0
' on simule la fleche vers la droite pour se deplacer dans le menu
PostMessage h, WM_KEYDOWN, VK_RIGHT, 0 'touche enfoncee
PostMessage h, WM_KEYUP, VK_RIGHT, 0 'touche relevee
'on simule la fleche vers le bas pour derouler le menu selectionne
PostMessage h, WM_KEYDOWN, VK_DOWN, 0
PostMessage h, WM_KEYUP, VK_DOWN, 0
'on simule la touche entree pour afficher la boite de dialogue
PostMessage h, WM_KEYDOWN, VK_RETURN, 0
PostMessage h, WM_KEYUP, VK_RETURN, 0
Exit Sub
23 juin 2011 à 13:19
23 juin 2011 à 09:58
GetObject(,"Word.Application")
etc.
22 juin 2011 à 20:05
Enfin sur la base de ton code j'arrive à piloter et meme modifier wordpad ou notepad, parcontre d'autres appli comme word,excel, writer,framemaker cela ne marche pas. SPY ne voit pas les commandes WM_COMMAND, il envoi des WM_SYSKKEYDONW,WM_SYSKEYUP .....Je n'arrive pas à reproduire ces commandes sous vb, rien ne marche.
Si tu as une idée cela m'aiderais bien
Merci
20 juin 2011 à 16:13
Je precise mon pb:avec la cde 'sendmessage wm_command,2,0& ' j'ouvre bien la boite de dialogue fichier, mais ensuite mon progr vb perd la main car c'est une boite modale, donc toutes mes commandes suivantes ne sont pas executées tant que la boîte est ouverte.Or je veux remplir avec vb la zone de texte du 'nom de fichier' (en fait je voudrais piloter complètement les menus de notepad.Merci pour une bonne idée
17 juin 2011 à 17:30
Merci pour ta reponse, grace à toi sur le modele de ton code je parviens à ouvrir le menu fichier de notepad. Mais je n'arrive pas à obtenir le handle de la zone de saisie du nom de fichier à ouvrir (avec spi j'ai la classe mais c'est la meme que la zone d'ecriture alors comment faire). Dautre part il y a t il un moyen de simuler des combinaisons de touches.
Merci si tu as compris ce que JE demande et si tu as une idee.
16 juin 2011 à 09:59
le code est effectivement dans un module (voir le .Zip)
pour l'ID, c'est avec Spy++ (voir .doc dans le zip)
pour ton handle, a voir s'il ne faut pas attendre que le process en face soit lancé (WaitForInputIdle)
15 juin 2011 à 17:49
J'ai testé et pour que cela marche j'ai du coller toutes les functions et les declarations api dans un module, cela marche donc tres bien avec la calculatrice. Maintenant je fais un test avec open writer qui s'ouvre bien avec la commande shell, je recupère bien le handle mais le lParam est toujours <> du nPID, donc message "Fenêtre pas trouvée".
Autre question comment trouver la bonne valeur numerique 304 dans ce code pour ouvrir le bon menu SendMessage hMainWnd, WM_COMMAND, 304, ByVal 0&
Bon but etant de piloter des appli comme FrameMaker avec vb
Meri pour ta reponse
PTARD
14 mars 2011 à 11:26
Merci de mettre à disposition ce savoir.
3 juin 2010 à 20:58
les ID des touches ne collent certainement pas.
tu as la méthode dans le cours, tu dois pourvoir faire le nécessaire ^^
non ??
3 juin 2010 à 17:39
28 mai 2010 à 13:31
28 mai 2010 à 12:18
Public Sub Main
28 mai 2010 à 09:36
Suivant tes conseils j'ai mis ton fichier ModMain.bas dans un "modules" mais la je n'arrive pas à lancer la procedure main...
Merci de ton aide.
28 mai 2010 à 07:21
27 mai 2010 à 23:58
pourquoi ca ne marche pas chez moi???
J'ai une erreur: dans la fonction:
Private Function GetWndFromProcessID(ByVal vnPID As Long) As Long
EnumWindows AddressOf EnumWindowsProc, vnPID
GetWndFromProcessID = mhFoundWnd
End Function
il me met:
Invalid use of AdressOf operator !!!!
J'ai essayé en vb6 e vba excel mais c'est la même chose.
Merci de votre aide et bravo pour le travail.
18 mars 2010 à 23:24
c'est bon a savoir ça
merci merci ^_^
18 mars 2010 à 23:17
n'est pas une bonne chose si le temps de traitement est incertain (boucle sans fin ?)
il faut relacher un peu le processeur et redonner la main a Windows.
DoEvents permet de redonner la main a l'interface pour montrer a windows que ton appli est pas crashée...
tu sais, parfois, ca indique "(ne réponds pas)" dans la barre de titre de certaines applis...
...
18 mars 2010 à 22:51
ça m'agase de pas y arriver
juste une dernier histoire de
Application.DoEvents()
ça sert a quoi exactement ?
En tout cas encore 1000 merci
18 mars 2010 à 21:49
mais oublie ce genre de boucles :
For Each ElementHtml As HtmlElement In LaPage
18 mars 2010 à 21:32
je connais pas ça...
alors merci merci merci beaucoup
mais je n'est pas de webbrower
moi je voudrais que ce soit avec Internet Explorer
bon c'est pas grave
merci merci encore
18 mars 2010 à 21:04
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
WebBrowser1.Navigate("http://www.facebook.com")
Do
Application.DoEvents()
Loop Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
WebBrowser1.Document.GetElementById("email").SetAttribute("value", TextBox1.Text)
WebBrowser1.Document.GetElementById("pass").SetAttribute("value", TextBox2.Text)
WebBrowser1.Document.GetElementById("login_form").InvokeMember("submit")
End Sub
le code de ce matin a été fait de tête... du coup c'etait de l'a peu pres
là c'est testé etc.
c'est fait sous Visual Studio (2005)
18 mars 2010 à 20:28
Dim IE As New InternetExplorer
Dim LaPage As HTMLElementCollection
ie = New InternetExplorer
ie = CreateObject("InternetExplorer.Application")
IE.Navigate("www.facebook.com")
IE.Visible = True
Do While IE.ReadyState <> tagREADYSTATE.READYSTATE_COMPLETE
Loop
LaPage = IE.Document
Try
For Each ElementHtml As HtmlElement In LaPage
ElementHtml.Document.GetElementById("email").InnerHtml = "monemail@societe.com"
ElementHtml.Document.GetElementById("password").InnerHtml = "abracadabra"
ElementHtml.Document.InvokeScript("click")
Next
Catch
MsgBox("Erreur")
End Try
18 mars 2010 à 20:05
18 mars 2010 à 19:28
Ah ! je suis vraiment desolé
mais ça marche pas:
Dim IE As New InternetExplorer
IE = New InternetExplorer
IE.Visible = True
IE.Navigate("www.facebook.com")
If IE.ReadyState = tagREADYSTATE.READYSTATE_COMPLETE Then
IE.Document.GetElementByID("email").Value = "monemail@societe.com"
IE.Document.GetElementByID("password").Value = "abracadabra"
IE.Document.GetElementByID("login_form").submit
End If
:[ Help me please !
En tout cas merci merci beaucoup de repondre a tout mes messages :]
ah au faite ton appli : http://www.vbfrance.com/code.aspx?ID=25669 j'ai une erreur avec VB2008 Express
quand je clic sur le bouton 'rechercher'
18 mars 2010 à 07:43
euh, tu te compliques la vie ^^
GetElementsByName("produit_nom")[0] irai bien...
ou bien, pour facebook :
le tout etant d'avoir attendu que le .readystate indique la fin du chargement de la page...
GetElementByID("email").Value = "monemail@societe.com"
GetElementByID("password").Value = "abracadabra"
GetElementByID("login_form").submit
17 mars 2010 à 19:53
17 mars 2010 à 19:52
mais ça marche pas !
je vais expliquer mon truc, enfin essayer, c'est tout bete mais ....
je voudrais que :
quand je clic sur un bouton ça m'ouvre une page Internet Explorer direct sur le site que je veux et que ça me connecte tout seul
Par exemple:
je clic sur le bouton et Facebook s'ouvre et active mon compte tout seul.
Voila je sais ça doit etre tout bete mais j'avoue que je galere ...
merci de m'aider pour ça deja
voila ce que j'ai deja essayé:
Dim ie As New InternetExplorer
ie = New InternetExplorer
ie.Navigate2("www.facebook.com")
'ie.Visible = True
'Dim theElementCollection As HTMLElementCollection
'theElementCollection = ie.Document.GetElementsByTagName("input")
'For Each curElement As HtmlElement In theElementCollection
' Dim controlName As String = curElement.GetAttribute("name").ToString
' If controlName = "produit_nom" Then
' curElement.SetAttribute("Value", SnomTextBox.Text.ToString)
'
' End If
'Next
'theElementCollection = ie.Document.GetElementsByTagName("input")
'For Each curElement As HtmlElement In theElementCollection
' If curElement.GetAttribute("value").Equals("Ok") Then
' curElement.InvokeMember("click")
'
' End If
'Next
je sais pas ce que ça vaut
merci merci .
17 mars 2010 à 05:46
http://www.vbfrance.com/code.aspx?ID=25669
17 mars 2010 à 00:37
mais internet explorer lui par contre oula !
J'arrive meme pas a me connecter automatiquement a facebook.
Comment on fait juste ça deja ?
Si vous avez un site ou un tuto pour le pilotage de IE et Excel, c'est eu qui m'interressent le plus pour le moment.
Merci d'avance et merci d'avoir repondu ;)
16 mars 2010 à 22:25
creuse un peu du coté des Excel.Application, etc
pour IE, il est possible de manipuler la page via le DOM
MSN, lui, propose certaines API et un activeX, me semble, également.
si y'a des questions plus précises...
n'hésites pas
16 mars 2010 à 22:15
Moi j'apprend tout juste avec vb2008.
C'est pour ça que le phrase de Renfield, je cite :
"Ravi de voir que ca sert, et que le niveau pédagogique vous convient.
Si vous souhaitez d'autres exemples particuliers, n'hésitez pas à m'en faire part"
m'a interpellé ;)
Voila je voudrais apprendre a piloter plusieurs application Windows.
- Internet Explorer
- MSN
- Outlook
- Excel
- Word
- ...
Voila donc si vous avez des codes source, des liens de site qui propose des codes source merci hésitez pas
Merci beaucoup d'avance
21 févr. 2010 à 22:15
21 févr. 2010 à 19:53
Je suis toujours bloqué avec mon problème de fenêtre modale.
Je n'ai aucun contrôle dessus même avec postmessage.
J'ai beau lancer des postmessage (au lieu de sendmessage), ils doivent rester dans la file d'attente des messages de la fenêtre modale...
Renfield, tu as sûrement la solution !!!
15 févr. 2010 à 17:49
Mais pour piloter complètement l'appli, il faut que j'aille plus loin et que je puisse récupérer les évènements (en particulier le document_complete après un submit par ex.)
Et là, je ne vois pas très bien comment faire...
Sniff...
11 févr. 2010 à 14:07
http://www.jose.it-berater.org/smfforum/index.php?topic=2293.0
11 févr. 2010 à 13:38
On me demande pour le boulot, d'écrire un prog capable de piloter une appli externe.
L'appli à piloter est une appli Windows qui 'encapsule' un navigateur WEB.
L'analyse par SPY++ donne les infos suivantes:
Liste des fenêtres :
00000001 "APPLI xxx" TWINDOW1
00001001 "" TWINDOW1
00002001 "" TWINDOW1
00003001 "" Shell Embeddig
00004001 "" Shell DocObjet View
00005001 "" Internet Explorer_Server
------------------------
Le but est de piloter les pages WEB du navigateur via le DOM.
Le problème est que la fenêtre n'est pas visible dans la collection retournée par la boucle CreateObject("Shell.Application").Windows
Je n'ai donc à ma disposition que le handle de la fenêtre Internet Explorer_Server
Est-il possible de récupérer un objet "fenêtre" à partir de ce handle de façon à faire du DOM ???
Merci
11 févr. 2010 à 12:52
la doc ne lui donne pas raison :
http://msdn.microsoft.com/en-us/library/bb775985(VS.85).aspx
If the button is in a dialog box and the dialog box is not active, the BM_CLICK message might fail. To ensure success in this situation, call the SetActiveWindow function to activate the dialog box before sending the BM_CLICK message to the button.
11 févr. 2010 à 12:40
Code: BN_CLICKED
Control ID: 1234
Control HWND: 0x00150A62
La commande est donc :
PostMessage CLng(&H150A62), BM_CLICK, 1234, ByVal 0& 'ou sendmessage
11 févr. 2010 à 12:35
Je vais continuer mes tests !
Sinon pour le bouton, j'ai trouvé :
PostMessage CLng(&H150A62), BM_CLICK, 1234, ByVal 0&
en ayant bien sûr déclaré la constante :
Private Const BM_CLICK As Long = &HF5
11 févr. 2010 à 11:46
voir PostMessage pour un retour immédiat
11 févr. 2010 à 11:34
Je vais essayer de l'expliquer :
J'essaye de piloter une application métier qui s'appelle Alphacam.
Cette application est pilotable en VBA mais toutes les fonctions ne sont pas disponibles... (Zut !)
Tout d'abord, je trouve le hwnd de la fenêtre "Alphacam": ça fonctionne.
Puis je lance :
ret = SendMessage(hwndF, WM_COMMAND, 32839, ByVal 0&) '32839 est donné par winspector : ça fonctionne
MsgBox ret
Le problème est que je n'ai plus la main jusqu'à ce que la commande soit terminée manuellement dans Alphacam.
La commande 32839 affiche un bouton sur lequel je dois cliquer, puis cliquer sur la pièce affichée à l'écran, etc...
Mon msgbox s'affiche uniquement quand j'ai fini de faire tout ça à la main.
Je ne sais pas comment interagir avec Alphacam pour automatiser ces opérations.
Je voudrais pouvoir faire quelque chose du genre :
SendMessage(hwndF, WM_COMMAND, 32839, ByVal 0&)
SendMessage(hwndF, WM_COMMAND, 32825, ByVal 0&)
SendMessage(hwndF, WM_COMMAND, 1234, ByVal 0&)
Est-ce qu'il y a un moyen de contourner ça ?
J'ai essayé avec postmessage qui fait exactement la même chose.
Je sèche un peu...
11 févr. 2010 à 09:58
SendMessage 0x00460336, WM_COMMAND, 1234, ByVal 0&
10 févr. 2010 à 18:10
Une petite question toutefois :
Quand on obtient ça avec Winspector, comment on le renvoie avec sendmessage :
Code: BN_CLICKED
Control ID: 1234
Control HWND: 0x00460336
J'ai essayé de le renvoyer avec BN_CLICKED et BM_CLICK mais il n'y a rien à faire.
Merci d'avance.
10 févr. 2010 à 11:59
Voici le code VB.Net qui t'interresse :
Dim shellWindows As SHDocVw.ShellWindows = New SHDocVw.ShellWindowsClass()
For Each oIE As SHDocVw.InternetExplorer In shellWindows
If TypeName(oIE.Document).ToString = "HTMLDocumentClass" Then
MsgBox(oIE.LocationURL)
End If
Next
9 févr. 2010 à 08:52
9 févr. 2010 à 05:40
8 févr. 2010 à 18:11
Mais j'ai du mal à transposer en VB.Net : j'arrive simplement à obtenir une liste de handles, mais pas une collection de fenêtres comme en VB6. Connais-tu une solution ?
8 févr. 2010 à 16:26
ensuite, soit tu identifie la fenetre "souhaitée" en regardant le titre, l'url, le hWnd ...
utilises ce genre de boucle :
Dim oWindow
For Each oWindow In CreateObject("Shell.Application").Windows
If TypeName(oWindow.Document) = "HTMLDocument" Then
MsgBox oWindow.LocationURL
End If
Next
8 févr. 2010 à 16:13
J'ai cependant une question concernant le pilotage d'une appli WEB :
Comment faire pour piloter un IE déjà lancé sur le poste de travail et non pas une nouvelle instance créée dans le prog. de pilotage ?
Une petite suggestion pour finir : publier un tuto de la même qualité sur l'objet WinHttpRequest
Merci
4 févr. 2010 à 14:19
Merci
4 févr. 2010 à 14:07
"c'est du VB6.... faut le charger avec Visual Basic 6."
4 févr. 2010 à 14:05
4 févr. 2010 à 14:00
4 févr. 2010 à 13:57
4 févr. 2010 à 11:41
4 févr. 2010 à 11:40
je pense que tu as tenté de l'ouvrir sous Visual Studio (pour .Net)
4 févr. 2010 à 11:37
26 janv. 2010 à 17:48
Si vous souhaitez d'autres exemples particuliers, n'hésitez pas à m'en faire part
26 janv. 2010 à 16:43
25 janv. 2010 à 03:00
24 janv. 2010 à 20:11
23 janv. 2010 à 13:32
Suite à ta réponse sur une question que j'avais posée concernant ce sujet, je n'ai jamais eu le temps de m'y mettre et de faire des tests. Mais là, j'ai une semaine de vacances et j'espère bien pouvoir y passer au moins une journée...
Je n'ai pas regardé encore les fichiers joints, mais je sens que ça va m'être bien utile... ;)
Merci encore...