SetWindowPos -- annuler un TOPMOST [Résolu]

_samy_ 14 Messages postés samedi 15 octobre 2005Date d'inscription 23 janvier 2008 Dernière intervention - 30 oct. 2006 à 16:27 - Dernière réponse : MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention
- 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 

8 réponses

Répondre au sujet
le cancre 292 Messages postés mercredi 25 octobre 2006Date d'inscription 27 novembre 2009 Dernière intervention - 30 oct. 2006 à 16:55
+3
Utile
 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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de le cancre
MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 30 oct. 2006 à 18:14
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de MadM@tt
MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 30 oct. 2006 à 16:47
0
Utile
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
_samy_ 14 Messages postés samedi 15 octobre 2005Date d'inscription 23 janvier 2008 Dernière intervention - 30 oct. 2006 à 17:18
0
Utile
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_
MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 30 oct. 2006 à 17:40
0
Utile
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
_samy_ 14 Messages postés samedi 15 octobre 2005Date d'inscription 23 janvier 2008 Dernière intervention - 30 oct. 2006 à 18:05
0
Utile
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_
_samy_ 14 Messages postés samedi 15 octobre 2005Date d'inscription 23 janvier 2008 Dernière intervention - 30 oct. 2006 à 18:25
0
Utile
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_
MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 30 oct. 2006 à 18:46
0
Utile
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.