2010-09-05 20 views
4

Dans mon application Windows, j'essaie de trouver la hauteur de la barre des tâches. Bien que je puisse programmer cela dans mon programme, je voudrais le trouver par programmation pour supporter les versions passées, présentes (win7) et futures de Windows.Comment trouver la hauteur de la barre des tâches?

Alors, comment ferais-je cela?

Répondre

4

Vous l'obtenez de GetMonitorInfo(), membre MONITORINFOEX.rcWork. Obtenez l'HMONITOR dont vous avez besoin pour appeler cette fonction depuis, disons, MonitorFromRect(), en passant votre rectangle de fenêtre. Ou MonitorFromPoint() ou EnumDisplayMonitors(), dépend de l'endroit où vous voulez afficher votre fenêtre. (0,0) est toujours le coin supérieur gauche du moniteur principal.

3

par la recherche Google pour "height of taskbar c++", j'ai obtenu le résultat suivant:

Voici comment obtenir la hauteur de la barre des tâches de Windows en utilisant les fenêtres fonctions FindWindow et GetWindowRect.

int MyClass::getTaskBarHeight() 
{ 
    RECT rect; 
    HWND taskBar = FindWindow(L"Shell_traywnd", NULL); 
    if(taskBar && GetWindowRect(taskBar, &rect)) { 
     return rect.bottom - rect.top; 
    } 
} 

Obtenir la largeur (si la barre des tâches sur la gauche ou à droite de l'écran ) peut être fait en utilisant:

rect-right - rect.left 

Vous pouvez vérifier si la largeur est supérieure que la hauteur. Si la largeur est plus grande, cela signifie que la barre est en haut ou en bas. Sinon, il est sur le côté gauche/droite de l'écran.

+0

Il peut y avoir plusieurs barres de tâches. Ou aucun si la fenêtre n'est pas affichée sur le moniteur principal. Ce n'est pas une bonne approche. –

+0

Cela semble être l'approche la plus simple. Je ne suis pas concerné par plusieurs moniteurs ou quelque chose d'improbable pour le moment. –

+0

Ceci est un hack non documenté. –

3

Demandez à Windows à ce sujet en utilisant le message ABM_GETTASKBAR et en spécifiant le hwnd pour la barre des tâches.

1

Probablement, vous voulez non seulement Taksbar, mais tous les autres «barres» sur l'écran?

Tout ce que vous avez réellement besoin est SystemParametersInfo(SPI_GETWORKAREA)

SystemParametersInfo, en passant SPI_GETWORKAREA comme paramètre

Récupère la taille de la zone de travail sur l'écran d'affichage principal. La zone de travail correspond à la partie de l'écran non masquée par la barre des tâches système ou par les barres d'outils de bureau de l'application. Le paramètre pvParam doit pointer vers une structure RECT qui reçoit les coordonnées de la zone de travail , exprimée en coordonnées d'écran virtuel.

0

Il existe de nombreuses méthodes selon vos besoins. J'ai utilisé EnumDisplayMonitors() car j'avais besoin de tester chaque affichage pour voir s'il avait une barre des tâches. Une méthode pour le faire est:

Utilisez EnumDisplayMonitors() pour obtenir une liste de tous les moniteurs.

MyInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) 

L'intérieur du rappel vous donnera une poignée pour un affichage. Avertissement cette fonction énumérera également les affichages virtuels: À l'aide de la poignée de l'affichage, utilisez GetMonitorInfo() avec la poignée à l'affichage.

Cela retournera le nom de l'affichage avec deux structures RECT l'une de la position d'affichage et la résolution, l'autre RECT sera la zone de travail. Vous aurez besoin de faire deux vérifications (une pour le X, une pour le Y) pour voir s'il y a une barre des tâches sur le moniteur et la hauteur ou la largeur de la barre des tâches.

Par exemple abord, nous vérifions l'axe Y:

if(monitor->rcMonitor.top == monitor->rcWork.top && 
monitor->rcMonitor.bottom == monitor->rcWork.bottom) 
{ 
std::cout << "There is no taskbar on the Y axis" << std::endl; 
} 
else 
{ 
std::cout << "There is a taskbar on the Y axis" << std::endl; 
int height = monitor->rcMonitor.bottom - monitor->rcMonitor.top; 
int hieghtOfTaskbar = height - (monitor.rcWork.bottom - monitor.rcWork.top); 
std::cout << "The height of the taskbar is: " << heightOfTaskbar << std::endl; 
} 

Ensuite, nous vérifions l'axe X:

if(monitor->rcMonitor.right == monitor->rcWork.right && 
monitor->rcMonitor.left == monitor->rcWork.left) 
{ 
std::cout << "There is no taskbar on the X axis" << std::endl; 
} 
else 
{ 
std::cout << "There is a taskbar on the X axis" << std::endl; 
int width = monitor->rcMonitor.left - monitor->rcMonitor.right; 
int widthOfTaskbar = height - (monitor.rcWork.left - monitor.rcWork.right); 
std::cout << "The width of the taskbar is: " << heightOfTaskbar << std::endl; 
} 

La hauteur ou la largeur, en fonction de la position, de la barre des tâches sera généralement le respectivement la hauteur ou la largeur du moniteur, bien que cela ne soit pas toujours le cas.