IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Application Access au premier plan


Sujet :

IHM

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut Application Access au premier plan
    Bonjour à tous,

    Après pas mal de recherches sur le forum, je n'ai pas trouvé ce qui me conviendrait dans mon cas...

    Je m'explique :

    J'ai une application Access qui est lancé automatiquement au démarrage du PC car c'est pour une utilisation sans clavier, ni souris, juste pour saisir des code-barres avec une douchette.

    Le problème, c'est que sur plusieurs PC, lors du démarrage, certaines applications doivent se charger après l'application Access et du coup celle-ci ne reste pas toujours au premier plan.

    Ce que je souhaiterais, c'est une sorte de boucle pour que tous les x temps la fenêtre access se mette au premier plan avec le focus.

    Merci pour votre aide......

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Sur l'événement Timer de ton formulaire (toutes des 5000 ms par ex), il faut user des API SetForeGroundWindow() ou bien SetWindowPos() ou encore BringWindowToTop()... couplée à SetFocus()...

    Pour ce qui est de SetWindowPos, elle fige la fenêtre devant et toutes les autres resteront à l'arrière plan.

    P.S. Le HWnd sera celui de l'application et non celui du Form.

    Argy

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    Merci pour la réponse... J'ai essayé différentes de vos propositions, mais n'étant pas très à l'aise avec Access, je n'arrive pas à avoir l'effet escompté.

    Voici ce que j'ai fais :

    Déclaration dans un module de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
    Ensuite, dans le code du formulaire, j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ' Code pour timer et mise au premier plan de l'application (chaque minute)
    Private Sub Form_Timer()
        BringWindowToTop hwnd
    End Sub
    Pour finir, dans les propriétés du formulaire, j'ai réglé l'intervalle minuterie à 1000.

    Au début, j'ai eu quelques erreurs de syntaxes, fonctions ou autres... et là plus rien, mais cela ne fait rien du tout !

    Une idée du problème ?

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    comment as-tu alimenté ton hwnd ?

    Le code a écrire pour le Handle de la fenêtre (Hwnd) est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Timer()
        BringWindowToTop Application.hWndAccessApp
    End Sub
    Argy

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    J'avais vu un jour qu'une application qui n'est pas au premier, ne peut se mettre au premier plan que sous certaines conditions.
    cf SetForegroundWindow

    C'est aussi ce qu'écrit un membre de DVP dans cette discussion.
    Sauf qu'il est plus fort que moi, et a trouvé une solution.
    Je l'ai traduite en VBA et voila ce que ça donne, dans le module de code d'un formulaire, dont on utilise le timer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Option Compare Database
    Option Explicit
     
    ' Renvoie 0 si échec
    Private Declare Function SetForegroundWindow Lib "user32" ( _
            ByVal hWnd As Long) As Long
     
    ' Renvoie 0 si échec
    Private Declare Function GetForegroundWindow Lib "user32" () As Long
     
    ' Renvoie N° Thread du thread appelant
    Private Declare Function GetCurrentThreadId Lib "Kernel32" () As Long
     
    ' Renvoie N° Thread du thread qui a créé la fenêtre dont le handle est hWnd
    Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
            ByVal hWnd As Long, ByRef ThreadId As Long) As Long
     
    ' Renvoie 0 si échec / bAttach : 1=Attach 0=Detach
    Private Declare Function AttachThreadInput Lib "user32" ( _
            ByVal ThreadId As Long, _
            ByVal ThreadIdToAttachTo As Long, _
            ByVal bAttach As Long) As Long
     
    Sub MettreCetteAppAuPremierPlan()
    ' Cette Application est celle qui exécute ce code VBA.
    ' Si c'est Access, le handle de sa fenêtre principale
    ' est Application.hWndAccessApp.
    Dim hWndForeGnd As Long, ThreadIdForeGnd As Long
    Dim ThisThreadId As Long
    Dim lgRet As Long
     
    ' Handle de la fenêtre au premier plan.
    hWndForeGnd = GetForegroundWindow()
     
    ' Si on a obtenu un hanlde de fenêtre valide.
    If (hWndForeGnd <> 0) Then
       ' Si la fenêtre au premier plan est celle de cette application, on quitte.
       If (hWndForeGnd = Application.hWndAccessApp) Then Exit Sub
       ' N° Thread de la fenêtre au premier plan.
       ThreadIdForeGnd = GetWindowThreadProcessId(hWndForeGnd, ByVal 0&)
    End If
     
    ' N° Thread de cette application.
    ThisThreadId = GetCurrentThreadId()
     
    ' Si les threads sont valides.
    If (ThreadIdForeGnd <> 0) And (ThisThreadId <> 0) Then
        ' lie le traitement d'entrées de ce thread à celui de la fenêtre au premier plan.
        lgRet = AttachThreadInput(ThisThreadId, ThreadIdForeGnd, 1)
        ' Appelle SetForegroundWindow pour mettre au premier plan
        ' la fenêtre de cette application.
        lgRet = SetForegroundWindow(Application.hWndAccessApp)
        ' Défait la liaison.
        lgRet = AttachThreadInput(ThisThreadId, ThreadIdForeGnd, 0)
    End If
    End Sub
     
    Private Sub Form_Timer()
    MettreCetteAppAuPremierPlan
    End Sub
    Ça fonctionne pour moi avec Windows XP édition familiale.

    A+

  6. #6
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut brufis, argyronet et LedZeppII

    juste une suggestion, il est possible éventuellement à défaut de mettre en premier plan l'appli de rendre invisible ou mettre les autres en arrière plan avec entre autre un SetWindowPos... cela éviterait peut être le timer.


  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut [Résolu] Application Access au premier plan
    Citation Envoyé par LedZeppII Voir le message
    Bonjour,

    J'avais vu un jour qu'une application qui n'est pas au premier, ne peut se mettre au premier plan que sous certaines conditions.
    cf SetForegroundWindow

    C'est aussi ce qu'écrit un membre de DVP dans cette discussion.
    Sauf qu'il est plus fort que moi, et a trouvé une solution.
    Je l'ai traduite en VBA et voila ce que ça donne, dans le module de code d'un formulaire, dont on utilise le timer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Option Compare Database
    Option Explicit
     
    ' Renvoie 0 si échec
    Private Declare Function SetForegroundWindow Lib "user32" ( _
            ByVal hWnd As Long) As Long
     
    ' Renvoie 0 si échec
    Private Declare Function GetForegroundWindow Lib "user32" () As Long
     
    ' Renvoie N° Thread du thread appelant
    Private Declare Function GetCurrentThreadId Lib "Kernel32" () As Long
     
    ' Renvoie N° Thread du thread qui a créé la fenêtre dont le handle est hWnd
    Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
            ByVal hWnd As Long, ByRef ThreadId As Long) As Long
     
    ' Renvoie 0 si échec / bAttach : 1=Attach 0=Detach
    Private Declare Function AttachThreadInput Lib "user32" ( _
            ByVal ThreadId As Long, _
            ByVal ThreadIdToAttachTo As Long, _
            ByVal bAttach As Long) As Long
     
    Sub MettreCetteAppAuPremierPlan()
    ' Cette Application est celle qui exécute ce code VBA.
    ' Si c'est Access, le handle de sa fenêtre principale
    ' est Application.hWndAccessApp.
    Dim hWndForeGnd As Long, ThreadIdForeGnd As Long
    Dim ThisThreadId As Long
    Dim lgRet As Long
     
    ' Handle de la fenêtre au premier plan.
    hWndForeGnd = GetForegroundWindow()
     
    ' Si on a obtenu un hanlde de fenêtre valide.
    If (hWndForeGnd <> 0) Then
       ' Si la fenêtre au premier plan est celle de cette application, on quitte.
       If (hWndForeGnd = Application.hWndAccessApp) Then Exit Sub
       ' N° Thread de la fenêtre au premier plan.
       ThreadIdForeGnd = GetWindowThreadProcessId(hWndForeGnd, ByVal 0&)
    End If
     
    ' N° Thread de cette application.
    ThisThreadId = GetCurrentThreadId()
     
    ' Si les threads sont valides.
    If (ThreadIdForeGnd <> 0) And (ThisThreadId <> 0) Then
        ' lie le traitement d'entrées de ce thread à celui de la fenêtre au premier plan.
        lgRet = AttachThreadInput(ThisThreadId, ThreadIdForeGnd, 1)
        ' Appelle SetForegroundWindow pour mettre au premier plan
        ' la fenêtre de cette application.
        lgRet = SetForegroundWindow(Application.hWndAccessApp)
        ' Défait la liaison.
        lgRet = AttachThreadInput(ThisThreadId, ThreadIdForeGnd, 0)
    End If
    End Sub
     
    Private Sub Form_Timer()
    MettreCetteAppAuPremierPlan
    End Sub
    Ça fonctionne pour moi avec Windows XP édition familiale.

    A+
    PARFAIT ! ça fonctionne nickel... Windows 7 également.

    Merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mettre une application Access au premier plan
    Par funkyjul dans le forum VBA Access
    Réponses: 6
    Dernier message: 20/05/2008, 15h58
  2. Passer mon application access en premier plan ?
    Par electrosat03 dans le forum Access
    Réponses: 2
    Dernier message: 10/01/2007, 16h30
  3. [JFrame] Affichage d'une application toujours au premier plan
    Par michaeljeru dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 06/12/2006, 22h49
  4. [VB.NET] Application externe en premier plan
    Par gingman dans le forum Windows Forms
    Réponses: 3
    Dernier message: 01/12/2006, 16h05
  5. Savoir quelle application est au premier plan
    Par David dans le forum Delphi
    Réponses: 5
    Dernier message: 08/10/2006, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo