Mettre au premier plan avec SetForegroundWindow, SetFocus, et ShowWindow

Wlad69 Messages postés 6 Date d'inscription lundi 9 septembre 2002 Statut Membre Dernière intervention 5 mai 2021 - 5 juin 2008 à 18:34
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 6 juin 2008 à 18:39
Bonjour,

Je veux qu'à intervalle régulier Access vienne s'afficher au premier plan (au dessus de tous les autres application).
En VBA (Access 2000), sur le timer d'un formulaire, j'ai mis

Private Sub Form_Timer()
    call PremierPlan
End Sub

et dans un module, j'ai mis

Private Declare Function SetFocus _
Lib "user32" (ByVal hwnd As Long) 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
Private Const SW_MAXIMIZE = 3

Sub PremierPlan()
Dim hwnd As Long
Dim lRes

    hwnd = Application.hWndAccessApp
   
    lRes = SetForegroundWindow(hwnd)
    lRes = SetFocus(hwnd)
    lRes = ShowWindow(hwnd, SW_MAXIMIZE)

End Sub

Suivant les applications qui ont le focus et qui sont affichés, parfois çà fonctionne... et malheureusement parfois çà marche pas. Je ne sais pas pourquoi.

Merci de votre aide.

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 juin 2008 à 12:46
Salut
Ta méthode semble bonne.
Reste à savoir si la fenêtre que tu veux mettre en premier plan est le logiciel Access ou un des états ou autre.
Pour t'aider dans tes essais, vérifie que le handle (hwnd) est le bon avec cet outil : <winId> qui te fournira le handle de la fenêtre que tu es en train de survoler avec la souris, tu poiurras ainsi la comparer.
La valeur affichée par ce logiciel est en hexadécimal.
Pour afficher la valeur que tu obtiens, convertis-la en hexa :
   MsgBox Hex(hwnd)
Fait attention à ne pas mettre ton Timer trop rapide, ça pourrait charger inutilement la machine.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Wlad69 Messages postés 6 Date d'inscription lundi 9 septembre 2002 Statut Membre Dernière intervention 5 mai 2021
6 juin 2008 à 15:51
J'ai fait des essais avec WinID, et je n'ai rien remarqué de particulier.
J'ai essayé de travailler avec le handle du formulaire et avec le handle de la fenêtre Access.
=>çà  fonctionne mieux avec le handle d'Access.

En fait dans certains cas, Access apparait bien en plein écran au premier plan(fonctionnement souhiaté), mais dans d'autres cas Access est restauré en plein écran, mais pas au premier plan.

J'ai un doute sur l'ordre dans lequel je dois faire mes appels d'API.
0
Wlad69 Messages postés 6 Date d'inscription lundi 9 septembre 2002 Statut Membre Dernière intervention 5 mai 2021
6 juin 2008 à 16:33
J'ai ajouté un SetWindowsPos
Ce qui donne :

Sub PremierPlan()
Dim hWnd As Long
Dim hWndForm As Long
Dim lRes
Dim nom_fenetre As String

    'nom_fenetre = "Formulaire1 : Formulaire"
    'hWndForm = FindWindow(vbNullString, nom_fenetre)
   
    hWnd = Application.hWndAccessApp
   
    lRes = ShowWindow(hWnd, SW_MAXIMIZE)
    lRes = SetForegroundWindow(hWnd)
    lRes = SetFocus(hWnd)
    SetWindowPos hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
   
    'Debug.Print Hex(hWnd), Hex(hWndForm)
   
End Sub

Et maintenant çà a  l'air de fonctionner.
Merci de ton aide jack.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 juin 2008 à 18:39
Idée au hasard :
- Insère un DoEvents ou un Sleep (API) entre chaque commande
- Répète la commande SetFocus une deuxième fois

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Rejoignez-nous