SetWindowPos -- annuler un TOPMOST [Résolu]

Messages postés
14
Date d'inscription
samedi 15 octobre 2005
Dernière intervention
23 janvier 2008
- - Dernière réponse : MadM@tt
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
16 juillet 2009
- 30 oct. 2006 à 18:46
Salut à tous.

Je découvre de plus en plus le VBA et ce qu'il permet de faire... mais d'un autre côté, je me trouve confronté à des pb nouveaux !

Alors voilà, ça se passe en VBA sous Excel. J'ai un userform qui permet d'envoyer un message outlook express en y joignant un fichier.
Si outlook est déjà ouvert, sa fenêtre n'est alors pas au premier plan puisque nous sommes sur le userform.
J'utilise donc SetWindowPos avec HWND_TOPMOST pour mettre Outlook en premier plan afin de lui envoyer des combinaisons de touches qui permettent de créer un nouveau message et de remplir les différents champs dudit message.
Code :
SetWindowPos lhWndOE, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE

Ca marche très bien... sauf que (ben, oui, il y a toujours un "sauf que" ) ma fenêtre principale Outlouk reste en premier plan... même si elle est inactive. C'est gênant car je ne sais plus comment la remettre en "normal".
J'ai essayé SetWindowPos avec NOTOPMOST, sans succès. De même avec SWP_NOZORDER.
Code :
SetWindowPos lhWndOE, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOZORDER Or SWP_NOMOVE Or SWP_NOSIZE

En résumé, je me demande :
1 - Je voulais juste activer la fenêtre Outlook pour lui envoyer des raccourcis clavier. SetWindowPos était-elle la mieux appropriée pour cela ?
2 - Si oui, comment faire pour que Outlook ne soit plus tout le temps au dessus de toutes les autres fenêtre après lui avoir envoyé les raccourcis ?
3 - Si non, quelle autre méthode aurais-je dû employer ?

Merci d'avance pour vos réponses,
Samy.
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
292
Date d'inscription
mercredi 25 octobre 2006
Dernière intervention
27 novembre 2009
3
Merci
 je ne sais plus comment la remettre en "normal".

1) ShowWindow lhWndOE, SW_SHOWNORMAL


ou

2) SetWindowPos lhWndOE, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE


j'ai testé juste la 2, et c'est tout bon

Merci le cancre 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de le cancre
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
16 juillet 2009
3
Merci
Ah désolé j'aurais du préciser, c'est une api, donc une fonction d'une librairie de windows :
Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long

y'a aussi : SetForegroundWindow hwnd
(qui doit faire la meme chose)

Ciaò
MadMatt

Merci MadM@tt 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de MadM@tt
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
16 juillet 2009
0
Merci
Je pense que tu aurais peut etre mieux fait d'utiliser l'api SetFocus.
Comme ça tu fais un SetFocus sur outlook, tu envoie tes données, puis SetFocus pour renvoyer la done à ton prog.

Ciaò
MadMatt
Commenter la réponse de MadM@tt
Messages postés
14
Date d'inscription
samedi 15 octobre 2005
Dernière intervention
23 janvier 2008
0
Merci
Merci Le Cancre !

Finalement, j'ai deux solutions.
La première, c'est la deuxième de Le Cancre (ça fait bizarre ;). C'est étonnant, car je l'avais testée, mais sans succès... pourtant, elle marche très bien maintenant. Encore cette satanée interface chaise/clavier !

La deuxième est très fortement inspirée de la première solution de Le Cancre : au lieu d'utiliser HWND_TOPMOST pour afficher/activer mon Outlook, j'utilise "tout simplement" HWND_SHOWNORMAL.

@ MadM@tt : j'ai fait de brèves recherches sur SetFocus, elles mènent toutes sur des SetFocus d'objets de userform et pas sur des SetFocus d'applications. Cela doit certainement marcher, mais ayant trouvé une solution moins fatigante, je vais rester sur celle de Le Cancre. Merci tout de même !

@+
Samy
Commenter la réponse de _samy_
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
16 juillet 2009
0
Merci
Salut, je comprends que quand t'as trouvé une solution, tu veux pas t'embeter à en chercher une autre lol, moi aussi je suis pareil.
Enfin je vais expliquer vite fait, si jamais quelqu'un passe sur ce post et est interessé :
Je parlais de l'api SetFocus, elle est à appeler du genre :
SetFocus hWindow
où hWindow est le handle (numéro identificateur) de la fenetre à montrer.
En gros, c'est comme le SetFocus de VB dans les userform, mais la il s'agit d'une api, et on peut l'appliquer à n'importe quelle fenetre.

Voilà à +

Ciaò
MadMatt
Commenter la réponse de MadM@tt
Messages postés
14
Date d'inscription
samedi 15 octobre 2005
Dernière intervention
23 janvier 2008
0
Merci
Merci MadM@tt,

Effectivement, c'est mieux quand on y répond quand même.

Alors, je vais encore t'embêter :

Je fais donc un "SetFocus lhWndOE" où lhWndOE est le handle de Outlook, mais il me sort une erreur disant que SetFocus n'est pas une procédure définie...

J'ai essayé à tout hasard lhWndOE.SetFocus, mais cela ne fonctionne pas.

D'où ma question : aurais-je du déclarer auparavant qqchose ? (c'est la fin de journée, un lundi en plus, donc je commence à fatiguer ).

Merci !
Commenter la réponse de _samy_
Messages postés
14
Date d'inscription
samedi 15 octobre 2005
Dernière intervention
23 janvier 2008
0
Merci
Effectivement, j'ai trouvé la declare function (...) entre temps. Ce
qui est bizarre, c'est que cela a l'air de fonctionner (pas d'erreur
dans le code), mais pas de focus sur outlook (rien de changé dans
l'activation des fenêtres).

Donc SetFocus ne fonctionne pas vraiment pour activer ou mettre en premier plan une fenêtre.

En revanche, SetForegroundWindow fonctionne parfaitement !

Merci MadM@tt et bonne soirée !
Commenter la réponse de _samy_
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
16 juillet 2009
0
Merci
Ah je viens de lire que DarkSidious avait dit que ça marchait que pour une fenetre de notre application, et qu'il fallait utiliser SetForegroundWindow  si on voulait le faire pour une fenetre d'un autre prog, donc voilà le pourquoi.

Bon ben content que ça marche finalement

Ciaò
MadMatt
Commenter la réponse de MadM@tt

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.