XL 2016 Comment détecter la position de la barre des tâches

Roland_M

XLDnaute Barbatruc
Bonsoir tout le monde,

je ne trouve rien sur le net à ce sujet !?
code ou astuce pour détecter la position de la barre des tâches H/B/G/D !?
Merci d'avance.

j'ai mis version 2016 mais aussi pour 2007

EDIT: avec API probablement !?
mais si c'est une astuce sans api ce n'est pas plus mal !
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Roland_M,

Détecter je ne sais pas mais avec de bonnes lunettes aucun problème :
VB:
Sub Barre_des_taches()
Dim position$
While IsError(Application.Match(position, Array("H", "B", "G", "D"), 0))
    position = UCase(InputBox("Elle est où cette barre ?" & vbLf & vbLf & "Entrez H B G ou D :", "Barre des tâches", position))
    If position = "" Then Exit Sub
Wend
'---
End Sub
A+
 

Roland_M

XLDnaute Barbatruc
Bonsoir,

Salut Job et merci pour ton intervention !

pour l'instant je pratique de la sorte, exemple avec ceci:
1571162599687.png

mais j'espérais pouvoir le faire automatiquement par code, sans boite de dialogue ou autre.
tout comme on détecte une résolution écran, on ne demande pas quelle résolution avez vous ?

donc, vu le nombre de réponses, j'en conclue que ce n'est pas réalisable !? tant pis !
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Roland_M, re job75

Moi, je sais pas faire dire à Excel où elle se trouve, mais d'autres s'amusent à dire ce qu'elle contient. ;)
Je publie au cas ou cela puisse servir
Private Declare PtrSafe Function apiGetClassName Lib "user32" Alias _
"GetClassNameA" (ByVal hwnd As Long, _
ByVal lpClassname As String, _
ByVal nMaxCount As Long) As Long
Private Declare PtrSafe Function apiGetDesktopWindow Lib "user32" Alias _
"GetDesktopWindow" () As Long
Private Declare PtrSafe Function apiGetWindow Lib "user32" Alias _
"GetWindow" (ByVal hwnd As Long, _
ByVal wCmd As Long) As Long
Private Declare PtrSafe Function apiGetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hwnd As Long, ByVal _
nIndex As Long) As Long
Private Declare PtrSafe Function apiGetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hwnd As Long, ByVal _
lpString As String, ByVal aint As Long) As Long
Private Const mcGWCHILD = 5
Private Const mcGWHWNDNEXT = 2
Private Const mcGWLSTYLE = (-16)
Private Const mcWSVISIBLE = &H10000000
Private Const mconMAXLEN = 255

Function fEnumWindows()
Dim lngx As Long, lngLen As Long
Dim lngStyle As Long, strCaption As String

lngx = apiGetDesktopWindow()
'Return the first child to Desktop
lngx = apiGetWindow(lngx, mcGWCHILD)

Do While Not lngx = 0
strCaption = fGetCaption(lngx)
If Len(strCaption) > 0 Then
lngStyle = apiGetWindowLong(lngx, mcGWLSTYLE)
'enum visible windows only
If lngStyle And mcWSVISIBLE Then
ActiveCell.Value = fGetCaption(lngx)
ActiveCell.Offset(1, 0).Activate
End If
End If
lngx = apiGetWindow(lngx, mcGWHWNDNEXT)
Loop
End Function


Private Function fGetCaption(hwnd As Long) As String
Dim strBuffer As String
Dim intCount As Integer

strBuffer = String$(mconMAXLEN - 1, 0)
intCount = apiGetWindowText(hwnd, strBuffer, mconMAXLEN)
If intCount > 0 Then
fGetCaption = Left$(strBuffer, intCount)
End If
End Function


Sub test()
Range("A1").Activate
Call fEnumWindows
End Sub
[/code]
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Roland_M
Glané sur le web anglophone
Est-ce qu'on se rapproche de ce que tu souhaites faire?
VB:
Option Explicit
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
 
Private Type APPBARDATA
    cbSize As Long
    hwnd As Long
    uCallbackMessage As Long
    uEdge As Long
    rc As RECT
    lParam As Long
End Type

Const ABS_ALWAYSONTOP = &H2
Const ABS_AUTOHIDE = &H1
Const ABS_BOTH = &H3
Const ABM_GETSTATE = &H4
Const ABM_GETAUTOHIDEBAR = &H7
Const ABM_GETTASKBARPOS = &H5

Const ABE_LEFT = 0
Const ABE_TOP = 1
Const ABE_RIGHT = 2
Const ABE_BOTTOM = 3
 
Private Declare Function SHAppBarMessage Lib "shell32.dll" (ByVal dwMessage As Long, pData As APPBARDATA) As Long
Public Function GetTaskBarMetrics() As String
    Dim ABD As APPBARDATA
    ABD.cbSize = Len(ABD)
    SHAppBarMessage ABM_GETTASKBARPOS, ABD
    GetTaskBarMetrics = "TaskBarMetrics In Pixels (not twips)" & vbCrLf & _
        "Left: " & ABD.rc.Left & ", Right: " & ABD.rc.Right & ", Bottom: " & ABD.rc.Bottom & ", Top: " & ABD.rc.Top & vbCrLf & _
        "Width:" & ABD.rc.Right - ABD.rc.Left & vbCrLf & _
        "Height:" & ABD.rc.Bottom - ABD.rc.Top & vbCrLf & _
        "Location: " & ABD.uEdge & " (0-left, 1-top, 2-right, 3-bottom)"
End Function

Public Function TaskBarState() As String
    Dim ABD As APPBARDATA, res&
    ABD.cbSize = Len(ABD)
    res = SHAppBarMessage(ABM_GETSTATE, ABD)
    If res = 0 Then
        TaskBarState = "TaskBar not in auto-hide or always-on-top mode"
    ElseIf res = ABS_ALWAYSONTOP Then TaskBarState = "TaskBar always-on-top mode"
    ElseIf res = ABS_AUTOHIDE Then TaskBarState = "TaskBar is in auto-hide mode"
    ElseIf res = ABS_BOTH Then TaskBarState = "TaskBar is always-on-top and auto-hide modes"
    Else
        TaskBarState = "Unknown"
    End If
End Function

Sub Test()
MsgBox GetTaskBarMetrics
MsgBox TaskBarState
End Sub
 

Roland_M

XLDnaute Barbatruc
re

Conclusion hative me semble-t-il, je dirais plutôt que tout le monde s'en fout de savoir où est cette fichue barre...
tout le monde peut être mais pas moi car j'en ai besoin !
j'ai plusieurs logiciels qui tournent à mon ancienne entreprise et la plupart en plein écran !
avec des msgbox de saisies perso qui se placent à certains endroits précis selon les besoins
ceci afin de laisser un maximun de visibilité sur les feuilles
par exemple en bas à droite ou à gauche idem en haut
et certain pc on la barre des tâches à des endroits différents, pas toujours en bas !
et là le placement de ces userforms se retrouve derrière la barre des tâches !
si j'ai demandé ça ce n'est pas par caprices, j'ai passé l'âge !

EDIT: Merci Staple, je vais voir ça !
en espérant qu'il n'y a pas une floppé d'API !
 

Roland_M

XLDnaute Barbatruc
re

effectivement ça fonctionne !
ça fonctionne avec Win 7 64bits et Excel 2007 ainsi que Excel 2016

mais je vais voir pour les fonctions #VBA7

encore merci.

EDIT: je ne connais pas l'anglais, je n'aurais jamais trouvé !
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
re

j'ai simplement essayé la macro !
pour le reste aucun souci j'ai les données nécessaire pour adapter ça ne sera pas un problème !

en faite il n'y a qu'une seule fonction ! Function SHAppBarMessage
c'est sympa !
encore merci car ce n'était pas évident, en français j'ai rien vu !
 

Staple1600

XLDnaute Barbatruc
Re

Ce que je voulais dire:
Reviens (if you want) publier ton code utilisant l'API (que j'ai cité dans le message#8) pour les lecteurs de ce fil qui rencontreraient la même problématique que toi.
(Histoire de rester dans l'esprit du forum: partage des connaissances etc... ;))
 

Roland_M

XLDnaute Barbatruc
re

ok je verrai avec un modèle pour l'exemple
car mes classeurs qui vont profiter de cette fonctions sont beaucoup trop lourds !
je regarde à ça dès que possible !
 

job75

XLDnaute Barbatruc
et certain pc on la barre des tâches à des endroits différents, pas toujours en bas !
et là le placement de ces userforms se retrouve derrière la barre des tâches !
si j'ai demandé ça ce n'est pas par caprices, j'ai passé l'âge !
Moi aussi j'ai passé l'âge... de bricoler du VBA.

Un être normalement constitué voyant que la barre placée en haut cache l'UserForm la remettra en bas.
 

Roland_M

XLDnaute Barbatruc
Je sais Job, t'inquiètes, que ça ne nous empêche pas de dormir !

aller, sur ce une bonne nuit à vous deux ! et encore merci à vous !
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
Bonjour,

après une bonne nuit de sommeil, petit retour pour confirmer que ça fonctionne bien
comme promis je verrai pour faire une demo

j'ai modifié avec VBA7 (essai sur 2016 Ok)
#If VBA7 Then
Private Declare PtrSafe Function SHAppBarMessage Lib "shell32.dll" (ByVal dwMessage As Long, pData As APPBARDATA) As LongPtr
#Else
Private Declare Function SHAppBarMessage Lib "shell32.dll" (ByVal dwMessage As Long, pData As APPBARDATA) As Long
#End If

et la macro qui m'est utile: (avec bien entendu toutes les déclarations au préalable)
Public Function FPositionBarreDesTaches%()
Dim ABD As APPBARDATA
ABD.cbSize = Len(ABD): SHAppBarMessage ABM_GETTASKBARPOS, ABD 'appel fonction
FPositionBarreDesTaches = ABD.uEdge '(0-left, 1-top, 2-right, 3-bottom)
End Function

@Job45
Pour comprendre il faut connaître le contexte !
entreprise(verrerie flaconnage) qui tourne 24h/24 et 7jrs/7 avec suivi de production
et donc pointages divers toutes les heures !
vous comprenez que les personnes ne vont pas à chaque fois déplacer l'userform
vous me direz qu'il suffirait qu'ils positionnent la barre en bas !
mais moi je ne travaille pas comme ça, je fais en sorte d'adapter le programme
sans poser de contraintes à l'utilisateur, tout comme le ferai des professionnels (du moins j'essaye)
 
Haut Bas