Afficher une Form d'une appli en service (cachée) avec une autre appli, ou Exce

Résolu
GTI38 Messages postés 15 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 avril 2013 - 26 mars 2013 à 12:06
GTI38 Messages postés 15 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 avril 2013 - 28 mars 2013 à 13:56
Hello, Je bute sur un problème. J'ai une API qui fonctionne sur mon PC. Cette API est constituée d'une FORM qui lit des données sur mon réseau et les intègres à intervalles réguliers. Je n'ai pas besoins de voir cette API en permanence. Je la cache en fermant la FORM. l'appli tourne en tache de fond. Je la voie dans les processus. J'aimerai afficher la FORM à partir d'un fichier Excel avec une commande VBA, ou d'une autre applis (VB).
Je n'arrives pas à trouver le Handle de ma fenêtre (elle est invisible !!) je trouve le Handle de l'applis, mais pas celui de la fenêtre (Form)Je nage.
Help me Please ...
Chris.

GTICrackers_France

14 réponses

Utilisateur anonyme
26 mars 2013 à 13:23
Bonjour,

Bonjour ucfoutu,

Je pense qu'il s'agit d'une 'appli'.

@GTI38
Je viens d'avoir une idée qui te permettrait de t'affranchir du recours aux handles. Mais je ne sais pas si vb6 le permet. Je vais quand même donner mon idée :
Il suffirait de lancer ton application vb6 (paramétrée en instance unique voir ici) depuis excel ou autre avec paramètres de ligne de commande (voir ici avec excel).
Ces derniers pourront être récupérés par ton appli vb6 par la méthode Command (voir ici). En rusant un peu avec les paramètres de ligne de commande, tu pourrais faire faire à ton application ce que tu veux et même lui fournir des données.

ucfoutu précisera la faisabilité de ce système (avec des gants merci d'avance) ou pas.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 mars 2013 à 17:43
Bien.
Mais alors :
- tu connais le caption du Form === >> la fonction FindWindow de l'Api de Windows te permet d'en extraire le handle

- c'est depuis le classeur Excel, à son ouverture, donc, qu'il te faut utiliser ce handle pour rendre visible le Form en cause.

Ce ne sera donc pas du :
Forum > Visual Basic 6

mais du : Langages dérivés > VBA

(si j'ai bien compris ce que tu veux faire et si l'appli cachée est en état d'exécution, en marche, donc)

J'aimerais aussi afficher cette form à l'aide d'un bouton dans une autre application VB6.

sera grosso-modo similaire (extraction du handle puis affichage), mais au click d'un bouton et non au démarrage.
Confirme-moi que c'est bien cela et je te guiderai alors un peu plus.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
Utilisateur anonyme
26 mars 2013 à 20:08
Le moment est venu de montrer le code réalisé. Utilise les balises de coloration syntaxique (3eme icône en partant de la droite).
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 mars 2013 à 08:17
Reprends réellement tout a zéro car cela permettra d'éviter ensuite le nettoyage de toute la "batterie" de fonctions de l'Api de Windows qui apparaissent dans le code que tu as montré.
Deux devraient suffire :
- FindWindow
et
- SetWindowpos
et tu n'as utilisé ni l'une, ni l'autre .
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 mars 2013 à 11:22
Je préfèrerais à ta place l'utilisation de SetWindowPos plutôt que ShowWindow.
Si je te l'ai suggérée, c'est pour une raison claire :
Elle te permet, elle, non seulement de montrer la fenêtre, mais en plus de la mettre au besoin sans faille en tout premier plan.
et bien d'autres choses encore ...

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 mars 2013 à 13:05
Bonjour (le français est une belle langue),
Quelle est don cette "API",
constituée d'une FORM qui lit des données sur mon réseau et les intègres à intervalles réguliers
?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 mars 2013 à 14:25
Bonjour, banana32,
des gants ? Pourquoi pas ? Mais précise lesquels. J'en ai bien quelques-uns, mais ils sont de boxe.
J'aimerais d'abord entendre GTI38 s'expliquer de manière technique sur ce forum (technique, lui). . On ne parlera qu'ensuite des gants à mettre.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
GTI38 Messages postés 15 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 avril 2013
26 mars 2013 à 17:28
Bonsoir,
Le Français est une belle langue DONC, effectivement !!
Il s'agit bien d'une application (soyons fous ...). J'ai conçu une application qui importe des données stockées dans un fichier txt, dans une Form. (peu importe les détails ...). Cette applications fonctionne sur mon poste de travail, elle importe les données à intervalles réguliers (toutes les heures) et la Form s'affiche automatiquement 2 fois par jour (matin, et début d'APM.) Les données au format txt sont générées à l'aide d'une feuille Excel. Cette feuille Excel est à la disposition des utilisateurs de mon réseau, ils y renseignent des informations professionnelles qui me sont destinées.
Je souhaiterai forcer l’apparition de la form de mon application lors de l'ouverture de cette feuille Excel. J'aimerais aussi afficher cette form à l'aide d'un bouton dans une autre application VB6.
Maintenant que vous savez tout, connaissez-vous un moyen de faire ceci ?
Merci
Chris

GTICrackers_France
0
GTI38 Messages postés 15 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 avril 2013
26 mars 2013 à 20:04
C'est bien ce que j'essaie de faire, mais je ne trouve pas le handle de ma form avec cette fonction. Je ne le trouve que lorsque la fenêtre est ouverte (visible). Lorsqu'elle est masquée (hide), je ne la trouve pas. J'ai essayé 2 méthodes trouvée sur ce site, mais ça ne fonctionne pas. Je trouve le handle de l'application, mais je n'arrives pas à ouvrir ma form.
Chris.
0
GTI38 Messages postés 15 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 avril 2013
27 mars 2013 à 07:57
Bonjour, de retour au bureau, je vous intègre le code essayé hier en VBA dans une feuille Excel. Celle-ci comporte 2 boutons; 1 bouton pour lancer la recherche de l'application cible et la lancer (si elle n'est pas active) ou afficher la Form (si elle tourne), et un bouton2 pour lister les fenêtres en service sur le poste.
J'utilise la commande GetWindow , mais je vois que tu parle de FindWindow. Mon problème est peut-être de ce coté !!
Voici mon code :

Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hWnd As Long, ByVal param As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Public Const SW_SHOW = 5

Sub Bouton1_Clic()
Handle = Application.hWnd
Dim strtmp As String
NewHandle = Handle
For sens = 2 To 3
    Do
        Handle = NewHandle
        strtmp = Space(100)
        r = GetWindowText(Handle, strtmp, 100)
        nom = strtmp
        If Left(nom, 8) = "Ctrl_PV2" Then
            result = ShowWindow(Handle, SW_SHOW)
'            Stop
            Exit Sub
        End If
        NewHandle = GetNextWindow(Handle, sens)
Loop Until Handle = NewHandle
Next
100 'suite - On lance l'appli si elle n'est pas en service
fichier = Shell(ThisWorkbook.Path & "\Ctrl_PV2.exe", 1)
End Sub


Sub Bouton2_Click()
Dim hWnd As Long
Dim Titre_Fenetre As String * 255
Dim TitreFen As String
Dim j As Long
' on teste les fenêtres
hWnd = GetWindow(GetDesktopWindow(), 5)
Do While (Not IsNull(hWnd)) And (hWnd <> 0)
Titre_Fenetre = String(255, 0)
ret = GetWindowText(hWnd, Titre_Fenetre, 255)
If Titre_Fenetre <> String(255, 0) Then
If IsWindowVisible(hWnd) = 1 Then
TitreFen = Titre_Fenetre
TitreFen = Left(TitreFen, ret)
j = j + 1
If Val(j) < 10 Then j = "0" & j
' Insère le résultat de la recherche dans la feuille Excel
Sheets(1).Range("E" & j).FormulaR1C1 = TitreFen
Sheets(1).Range("F" & j).FormulaR1C1 = hWnd
End If
End If
hWnd = GetWindow(hWnd, 2) 'cherche la fenêtre suivant
Loop
End Sub
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 mars 2013 à 08:11
J'utilise la commande GetWindow , mais je vois que tu parle de FindWindow. Mon problème est peut-être de ce coté !!

Il commence par là.
GetWindow et FindWindow sont deux choses très différentes.
GetWindow ne te permettra pas de trouver le hwnd de la fenêtre que tu as cachée et qui ne présente aucun Zorder par rapport à ton appli Excel.
C'est FindWindow, qu'il te faut utiliser pour extraire ce hwnd. Et c'est le Caption de la fenêtre que tu dois passer à FindWindow
Recommence tout à zéro et commence par cette seule première étape, pour l'instant : extraire le hwnd de cette fenêtre cachée.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
GTI38 Messages postés 15 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 avril 2013
27 mars 2013 à 08:31
O.K, je ne connais pas le fonctionnement de ces 2 fonctions, je vais donc retourner à mes chers études et reprendre depuis le début.
Merci pour cet éclairage, je te ferais part de mes essais quand j'aurais terminé.
(Je dois m'absenter pour cause de boulot, je reprends tout ça en fin de matinée.)
@+ et Merci.
0
GTI38 Messages postés 15 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 avril 2013
27 mars 2013 à 11:05
Re bonjour,
Alors là, oui, avec la bonne fonction, ça fonctionne effectivement bien mieux !!!
Je viens de rechercher des infos sur la fonction FindWindow, et bien ici ça fonctionne.
Ma commande sous VBA fonctionne, et il ne devrait pas y avoir de problème sous VB6.

Voici le nouveau code qui fonctionne :
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Const SW_SHOW = 5

Sub Bouton1_Clic()
Dim Handle, result
'Cherche le Handle de la Fenêtre
Handle = FindWindow(vbNullString, "Suivi des Evenements d'Exploitation.")
    If Handle <> 0 Then
        result = ShowWindow(Handle, SW_SHOW)
        Exit Sub
    End If
100 'suite - On lance l'appli si elle n'est pas en service
fichier = Shell(ThisWorkbook.Path & "\Ctrl_PV2.exe", 1)
End Sub


J'avoue que je ne connaissait pas cette fonction et je me suis mélangé les crayons avec GetWindow, ...
C'était pourtant simple !!! (comme souvent d'ailleur !!)
Je vais adapter mon code à mes différentes applications.
Merci à tous
Chris.
0
GTI38 Messages postés 15 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 avril 2013
28 mars 2013 à 13:56
Bonjour,
Pas de soucis de ce côté, j'ai une fonction dans mon application qui force l'affichage du Form au premier plan (en permanence). Pas de soucis de ce côté.
Merci pour cet éclairage efficace.
Chris.
0
Rejoignez-nous