Mettre une appli au premier plan [Résolu]

Messages postés
166
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
16 février 2011
- 8 juil. 2009 à 12:48 - Dernière réponse :
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 8 juil. 2009 à 14:37
Bonjour

Voila je galere depuis 2 jours a tenter de mettre l'appli outlook en avant plan et lui donner le focus

Voici ce que j'ai écrit et qui malheureusement ne fonctionne pas. (Mon appli perd le focus, mais outlook n'est pas affiché au premier plan)

    Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal IntPtr) As Boolean
    Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long





Sub activeappli()
        Dim  fenetre As IntPtr
        Dim ok As Boolean       

     ' On recherche tous les process de l'utilisateur
     For Each proc In Process.GetProcesses
            Debug.Print(proc.ProcessName)
            ' Si le nom du process est outlook
            If LCase(proc.ProcessName) = "outlook" Then
                ' On recupere le handle de la fenetre a partir du titre de la fenetre
                fenetre = FindWindow(Nothing, proc.MainWindowTitle)
                ' je n'ai pas trop compris si c'était nécéssaire....
                Call SetWindowPos(fenetre, HWND_TOPMOST, 0, 0, 800, 600, FLAGS)
                ' On passe l'appli en premier plan NE MARCHE PAS
                ok = SetForegroundWindow(fenetre)
                ' ?? 
                SetWindowPos(fenetre, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
            End If
        Next
End sub


Donc voila, si quelqu'un pouvait me donner un coup de pouce avant que je ne me jete par la fenetre....

Ha oui, je suis obligé de passer par la logique du process car le titre de la fentre outlook n'est pas forcément connu et dépend du dossier outlook qui est ouvert
(ex Outlook - Boîte de réception ou Outlook - Tâches etc)
Donc mon idée est
1/ Je liste les process en cours
2/ Si le process est égal outlook je recupere le nom de la fenetre
3/ J'active cette fenetre
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
8 juil. 2009 à 14:18
3
Merci
tes déclarations d'API sont foireuses...

Long => Integer

et:
Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal IntPtr) As Boolean

que vaut ton 'FLAGS' ? SetWindowPos pas utile si tu souhaite pas placer ton appli en premier plan permanent

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de Renfield
Messages postés
166
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
16 février 2011
8 juil. 2009 à 14:26
0
Merci
Je répond à moi-meme

Le probleme semble venir des déclarations

Si je déclare ainsi

          Declare Function SetActiveWindow Lib "user32" Alias  "SetActiveWindow" (ByVal hwnd As Long) As Long
          Declare Function ShowWindow Lib "user32" Alias "ShowWindow" ( ByVal hwnd As Long,  ByVal nCmdShow As Long) As Long
          Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long

Mon code fonctionne. J'ai un peu de mal a comprendre pourquoi dans l'aide de visual studio ils disent de déclarer avec des Intptr alors que ca ne fonctionne pas....

Bref et j'ai réécri mon code pour l'optimiser

        Dim Outlook() As Process = Process.GetProcessesByName("Outlook")
        If Outlook.Length > 0 Then           
            SetActiveWindow(Outlook(0).MainWindowHandle)
            SetForegroundWindow(Outlook(0).MainWindowHandle)
        End If
Commenter la réponse de thonyboy
Messages postés
166
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
16 février 2011
8 juil. 2009 à 14:30
0
Merci
Désolé Renfield, je n'avais pas vu ta réponse avant de poster la mienne.
Merci tu as vu juste

Mais tu me donnes encore une déclaration differente de la mienne

Alors je vais te faire confiance et reprendre la tienne/
Commenter la réponse de thonyboy
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
8 juil. 2009 à 14:35
0
Merci
Long => Integer, c'est important (équilibre de la pile)
Commenter la réponse de Renfield
Messages postés
166
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
16 février 2011
8 juil. 2009 à 14:36
0
Merci
Ha mais non

Si je fais comme toi
 Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal IntPtr) As Boolean
Ca ne fonctionne pas ! Outlook ne vient pas au premier plan

Si je fais comme ca
Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long

Ca fonctionne !

Je ne comprends toujours pas pourquoi il existe tant de déclarations differentes que ce soit dans l'aide, sur msdn, ou des sites et forums spécialisés.
Commenter la réponse de thonyboy
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
8 juil. 2009 à 14:37
0
Merci
décalration ? je ne t'en ai pas fourni, je mettais en avant ta déclaration, dans le premier post :

Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal IntPtr) As Boolean

"ByVal IntPtr" manque un bout là, non ?
Commenter la réponse de Renfield

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.