Fenetre grise lors d'un basculement sur une autre appli

Signaler
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour, encore un autre problème sur excel 2010

voilà, dans le cadre d'un projet, je suis amené à utiliser une macro vba qui me permet de passer d'Excel vers une autre application (programmé sous TeemTalk) afin de rapatriée des données.
Pour ce faire j'ais utilisée les API de Windows (fonction FindWindows).
Néanmoins la macro étant amené à être utiliser à de nombreuse reprise sur une courte période, j'ai remarqué qu'à partir d'un certain moment la fenêtre de l'application appeler beugger (son emplacement sur l'écran se grise, le retour sur Excel a du mal et surtout le rapatriement de l'information voulu ne se fais plus)
Merci de votre aide

ci-joint mon code :

Sub Appelxxxxx()
Dim hwnd As Long

hwnd = FindWindow(vbNullString, "xxxxxxx")
SetForegroundWindow hwnd
DoEvents
Sleep 200
ShowWindow hwnd, SW_SHOWMAXIMIZED
DoEvents
Sleep 200
End Sub

PS : Sans les deux tempo le problème est identique, l'écran se grise et la macro beug

20 réponses


La même question trois fois en deux jours, avec un sujet différent à chaque fois pour être sûr d'attirer les lecteurs.


PASSAGE-EXCEL-VERS-AUTRE-APPLICATION

SENDKEYS-CRTL-DROIT.

FENETRE-GRISE-LORS-BASCULEMENT-SUR-AUTRE-APPLI.


Faut croire que c'est urgent

Bonsoir,

SetForegroundWindow, ShowWindow renvoient des booléens : as-tu vérifié ce qu'elles renvoient ainsi que la valeur du handle (hdwn) ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour,
contrairement au hdc (le handle d'un contexte de dispositif), le hwnd (handle de la fenêtre elle-même) ne risque pas de changer "en cours de route" tant que la fenêtre est "ouverte".
Il est extrêmement malsain de recalculer ce handle hwnd à chaque appel de la procédure Appelxxxxx.*
Il n'est pas très adroit de nommer ce handle par hwnd (qui est une propriété des objets de VB6). Vaudrait mieux l'appeler autrement (par exemple : le_hwnd)
Ce handle (le_hwnd, donc) devrait être déclaré en type long soit en variable générale, soit en variable publique.
On ne sait pas pourquoi (quel est donc le contexte ?) tu es conduit si fréquemment à ré-afficher cette fenêtre en mode SHOWMAXIMIZED !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Bonsoir ucfoutu,

Je me suis demandé si une application qui ne permet pas d'être 'maximized' pouvait interpréter le message ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonsoir, banana32
S'il a le handle de la fenêtre : aucune raison.
Il aurait alors éventuellement un message d'erreur (par exemple avec un Form Modal), mais pas ce "phénomène" graphique qu'il dénonce (fenêtre grisée).
De toutes manières : regarde plus attentivement ce passage de son exposé :
j'ai remarqué qu?à partir d'un certain moment la fenêtre de l'application appeler beugger (son emplacement sur l'écran se grise, le retour sur Excel a du mal et surtout le rapatriement de l'information voulu ne se fais plus)

La fenêtre appelée passe donc apparemment en maximized sans problème au début, mais les choses se corsent ensuite.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Je me demande d'ailleurs si d'autres parties de son code (non montrées ici) n'épuisent pas sa mémoire. Et ce serait alors une fausse idée qu'il aurait des raisons réelles du phénomène observé.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

vers une autre application (programmé sous TeemTalk)

Ou un bug dans cette application
Pour répondre à tout le monde

@cmarcotte : effectivement, c'est un peu urgent puisque je suis sensé présenter mon projet en fin de semaine et il serait préférable qu'il n'y ait pas de bug. De plus je vois que tu a pris le temps de lister les 3 sujet que j'ais poster mais si tu les aurait ris le temps de les lire, tu aurais pu t?apercevoir que seul 2 sujet sont identique. Ce qui est dû au fait que comme je n'ai eu aucune réponse au sujet PASSAGE-EXCEL-VERS-AUTRE-APPLICATION (le même que ce sujet-là) j'ai voulu le changer de section, mais je n'ai pas trouvé comment le faire sur ce site.

Pour ce qui est du sujet en lui-même :
Je n'ai pas vraiment vérifié que le handle renvoyer une valeur <> 0 étant donnée qu'à chaque fois que je lance ma macro, la fenêtre s'affiche (mais bug de temps à autre). Donc il me semble que le handle renvoie bien une valeur (mais laquelle, aucune idée)

J'ai remplacé dans mon code le hwnd par le_hwnd, mais là ça ne va même plus chercher la fenêtre (alors que j'ai bien fais la modification partout).
J'ai lu sur certain forum qu'on pouvait directement appeler la fenêtre en appellent directement le numéro du handle. Ce qui évite de le recalculer à chaque fois (je pense que c'est de la que viens mon problème). Mais je n'ai pas trouvé les codes pour le faire, si quelqu'un pouvait me guider svp.

Au passage l'application permet bien d'être ?maximized? c'est d'ailleurs dans cet état que je la laisse en arrière-plan avant le premier lancement de la macro.
Concernant le reste du fichier, c'est vrai qu'il est assez conséquent (mais il ne pèse pas si lourd que ça ~ 50ko). En fait je lance une dizaine de sub les unes après les autres en basculant entre 2 fichiers Excel + cette application. Mais je ne fais pas de calcul ou autres. Principalement je compare des références qui sont stocké dans des cellules et je rapatrie des données de l'application.

Et pour finir, je ne pense pas que le bug vienne de l'application (même si ce n'est pas un foudre de guerre) puisque ça marche ~80% du temps et quand ca bug ca viens de l'appel de la fenêtre.

Si quelqu'un pouvait m?aider sur cette histoire de handle ça serait bien sympathique.
Merci encore.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
J'ai remplacé dans mon code le hwnd par le_hwnd, mais là ça ne va même plus chercher la fenêtre (alors que j'ai bien fais la modification partout).

Je ne sais pas comment tu t'y est pris, mais ce que tu dis là n'a pas de vrai sens !
hwnd n'est que le nom (de varible) donné au handle extrait par FindWindows. Tu pourrais aussi bien l'appeler toto, titi ou tartempion !
il me semble que le handle renvoie bien une valeur (mais laquelle, aucune idée)

un long, pardi, qui est l'identificateur de la fenêtre concernée.
Relis ce que j'ai écrit plus haut ! Inutile de le recalculer à chaque fois !
Déclare-le en variable générale, ouvre la fenêtre en cause, extrais-le une fois pour toutes par FindWindows. Utilise-le ensuite (ce long) en tant que de besoin. Il ne variera pas tant que la fenêtre reste ouverte.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Quand je parler de la valeur retourner par le handle, je voulais justement parler de son identification, certaine personne utilise directement cette valeur au lieu de lui affecter une constante. (extraction de la valeur du handle et utilisation de cette valeur directement dans le code, mais j'ai pas su comment il faisiat pour extraire la valeur de leur handle)

Pour faire comme tu m'a dit, j'ai placé hWnd en variable public et lui ai affecté la fenêtre qui m?intéresse juste derrière.
Mais lors de l'exécution de la macro, j'ai un message d'erreur avec : Instruction incorrecte à l'extérieur d'une procédure.

Si quelqu'un peut me corriger, je suis vraiment pas expert en programation

Voilà ce que j'ais dans ce module :

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function FindWindow Lib "user32" Alias (ByVal lpClassName As String, ByVal lpWindowName As Any) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Public hWnd As Long
hWnd = FindWindow(vbNullString, "xxxxxxxx")
Private Const SW_SHOWMAXIMIZED As Long = 3

Sub Appelxxxxxxxx()
SetForegroundWindow hWnd
DoEvents
Sleep 200
ShowWindow hWnd, SW_SHOWMAXIMIZED
DoEvents
Sleep 200
End Sub
C'est bon, j'ai fini par trouver. J'ai affecter la valeur du handle de ma fenetre à la constante hWnd.

Je vais tester pour voir si le bug persiste ou pas.
Merci pour les infos
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
C'est bon, j'ai fini par trouver. J'ai affecter la valeur du handle de ma fenetre à la constante hWnd.

Quand je lis de telles choses, affirmées avec tant de conviction ===>> je me sauve !
Car là, c'est plutôt "grave" !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Je répète une fois de plus que je ne maitrise pas du tout Excel (d'ailleurs je me serais bien passer de cette partie de mon projet..). Donc si je dis des absurdités, je préfèrerais qu'on me les corrige plutôt que de seulement les pointer du doigt. Merci

Je reprends sur mon problème. Mon code marchait bien jusqu'à ce que je ferme et ré-ouvre le tout. Apparemment la valeur du handle change à chaque réouverture du fichier du coup l'ancienne valeur affecter a hWnd n'est plus bonne.
J'ai essayé d'écrire ça en déclaration globale avant la sub pour que le hWnd prenne la valeur de la fenetre a chaque lancement du fichier, mais Excel ne veut pas me le prendre

Public hWnd As Long
hWnd = FindWindow(vbNullString, "SHERPA/AULNAY par FASAFAS")

Si quelqu'un peut m?apporter une solution, je lui en serais très reconnaissant. Merci

Le problème de FindWindow, c'est que si le texte de la barre titre de l'application change (SHERPA/AULNAY par FASAFAS), tu ne pourras plus y accéder avec ton code en dur :
hWnd = FindWindow(vbNullString, "SHERPA/AULNAY par FASAFAS") 

Est-ce le cas ?
dans mon cas, le titre de l'application ne change pas tout au long de son utilisation.

peut etre que je dit n'importe quoi, mais c'est entre-autre pour cela que le fait que son handle change m'étonne.

De quelle façon est appelée ta sub Appelxxxx()
Et comment sont récupérées les données extraites de cette application ?
la sub est appler avec : Application.Run "Appelxxxx"

Les données sont extraite avec un copier coller. Enfaite j'ouvre la fenetre de l'application en grand et je pilote la souris pour récupérer des donnée qui se trouve toujours au meme endroit (bon ... j'arrive pas directement à la page de donnée, je dois d'abord entrée un certain nombre de renseignement qui sont référencer dans mon fichier excel pour avoir les donnée que je désire obtenir).
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Donc si je dis des absurdités, je préfèrerais qu'on me les corrige plutôt que de seulement les pointer du doigt. Merci

1) l'absurdité, comme tu dis, était dans le fait de parler de "constante", là où une variable était utilisée.
Cela ne se "corrige" pas, mais appelle un certain "sursaut" !
2) l'examen de ta procédure montre de manière nette que tu ne lui passe aucun paramètre; Il ne peut donc que toujours s'agir de la même fenêtre, dont le nom figure en dur dans ta procédure !
Je ne vois pas alors la nécessité de la fermer et de la rouvrir. Et elle garde dans ce cas son hwnd (dit plus haut).
3) j'ose imaginer qu'il ne s'agit que d'une seule fenêtre et pas de plusieurs fenêtres différentes, une pour chaque fenêtre, hein ...
Voilà voilà. Mais je te laisse personnellement pile là, car plus cela "avance" plus j'ai la très nette impression que je ne suis pas sur ta planète (ou que tu n'es pas sur la mienne) et que nous utilisons des langages forts différents.
Bonne chance.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Je vais rebondir que la réponse pour apporter plus d'information à mon problème car : « sur la question d'un sourd, un aveugle peut toujours répondre »
Je parlais de constante étant donné que la fenêtre appeler grade le même nom tout au long de l'utilisation, donc son handle n'est pas sensé changer.
Il s'agit bien d'une seule fenêtre. J'ai notifié plus haut que j'ouvrais la fenêtre de l'application en même que mes deux fichier Excel et que je laisser la macro se charger de « naviguer » entre les deux fichiers Excel et l'autre application afin de rapatrier les données voulu.
Sachant que mon problème se situe au niveau de l'appel de la fenêtre de l'application qui bug de temps e temps quand on l'appel (symptôme : la fenêtre appeler se grise, je ne peux donc rapatrier aucune donnée de plus le retour sur Excel ne se fais plus correctement).
En espérant qu'une personne pourra m?aider à résoudre mon problème.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Ouais...
Je ne sais pas si tu en es conscient, mais ce sont les bases même qui te manquent et qui explique mon "sursaut".
Citation :
J'ai essayé d'écrire ça en déclaration globale avant la sub pour que le hWnd prenne la valeur de la fenetre a chaque lancement du fichier, mais Excel ne veut pas me le prendre

Public hWnd As Long
hWnd = FindWindow(vbNullString, "SHERPA/AULNAY par FASAFAS")

comment peux-tu écrire ce que j'ai souligné hors procédure ?
Il est impossible, hors procédure, de donner une instruction d'affectation à une variable !
Cette ligne, par contre, peut être mise dans ta procédure. Pour ne pas extraire ce qui l'a déjà été, c'est vraiment tout bête : exemple :
if hWnd =0 then hwnd FindWindow(vbNullString, "SHERPA/AULNAY par FASAFAS")

mais le mieux est encore de mettre le code suivant dans la procédure dans laquelle tu ouvres la fenêtre concernée et :
hWnd = FindWindow(vbNullString, "SHERPA/AULNAY par FASAFAS")

établira la valeur de hwnd qui, étant une variable publique déclarée dans un module .bas, sera accessible de partout.
C'est là vraiment le B.A.BA, ami.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ