Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/12/2011, 10h35   #1
Invité régulier
 
Inscription : octobre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 24
Points : 5
Points : 5
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......
brufis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 16h29   #2
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 659
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 659
Points : 6 225
Points : 6 225
Envoyer un message via MSN à argyronet
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
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 10h29   #3
Invité régulier
 
Inscription : octobre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 24
Points : 5
Points : 5
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 :
Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Ensuite, dans le code du formulaire, j'ai ajouté :
Code :
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 ?
brufis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 07h32   #4
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 659
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 659
Points : 6 225
Points : 6 225
Envoyer un message via MSN à argyronet
comment as-tu alimenté ton hwnd ?

Le code a écrire pour le Handle de la fenêtre (Hwnd) est :
Code :
1
2
3
Private Sub Form_Timer()
    BringWindowToTop Application.hWndAccessApp
End Sub
Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 19h04   #5
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
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 :
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 19h41   #6
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
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 644
Points : 3 895
Points : 3 895
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.

vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 10h51   #7
Invité régulier
 
Inscription : octobre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 24
Points : 5
Points : 5
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 :
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.
brufis est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h45.


 
 
 
 
Partenaires

Hébergement Web