2010-10-26 7 views
0

Je souhaite positionner une fenêtre en bas de l'écran. Si le menu Démarrer est présent, je veux qu'il se trouve en haut du menu Démarrer. Si ce n'est pas le cas (ou s'il est masqué automatiquement), je veux toujours qu'il soit dans la même position que si le menu de démarrage était là, ce qui signifie qu'il y aura un espace de quelques pixels.win32: détecter si le menu de démarrage est masqué automatiquement?

Actuellement j'obtiens la zone de travail du moniteur, positionne la fenêtre en bas, et toujours décalée de 20 pixels environ. Si le menu de démarrage n'est pas là, cela fonctionne bien. Si c'est le cas, cependant, la zone de travail se rétrécit également (comme il se doit), et je finis par doubler la compensation.

Comment réparer le problème?

Répondre

0

Utilisez-vous ou avez-vous accès à .NET dans votre projet? Si tel est le cas, vous pouvez utiliser la propriété Screen.PrimaryScreen.WorkingArea.Height pour déterminer le bas de l'écran en excluant la barre des tâches.

Vous pouvez également obtenir la hauteur totale de l'écran en obtenant la propriété Screen.PrimaryScreen.Bounds.Height (qui inclut la barre des tâches dans la valeur de hauteur totale).

En comparant ces valeurs, si elles sont identiques, la barre des tâches n'est pas présente. Sinon, la barre des tâches est et vous pouvez ajuster en conséquence.

+0

hmm Je n'ai pas de .NET, mais je pourrais être en mesure d'obtenir cette information avec des appels api win32 old-school .. – Claudiu

+0

Je pense que la barre des tâches prend quelques pixels même lorsqu'elle est cachée. Et quand la barre des tâches n'est pas présente, comment obtenez-vous sa hauteur afin que vous puissiez le soustraire? –

+0

bon point .. j'allais juste supposer la barre des tâches standard de win98 un-unité-élevée – Claudiu

2

Pour obtenir la zone de travail de l'écran non obscurci par la barre des tâches du système ou par des barres d'outils de bureau d'application, vous pouvez utiliser SystemParametersInfo() avec SPI_GETWORKAREA comme paramètre uiAction. Le paramètre pvParam doit pointer vers une structure RECT qui reçoit les coordonnées de la zone de travail, exprimées en coordonnées d'écran virtuelles. Par exemple:

RECT rectWorkArea; 
    SystemParametersInfo(SPI_GETWORKAREA, 0, &rectWorkArea, 0); 

Comme vous l'avez dit dans le commentaire, pour obtenir le rectangle de délimitation de la barre des tâches, nous pouvons appeler SHAppBarMessage(ABM_GETTASKBARPOS, ...)

Pour déterminer la position de la barre des tâches (si elle est actuellement en bas, en haut, à gauche ou à droite de l'écran), vous pouvez utiliser le calcul suivant:

type 
    TTaskBarPos = (_TOP, _BOTTOM, _LEFT, _RIGHT); 
    var 
    iScrW, iScrH: Longint; 

    iScrW := GetSystemMetrics(SM_CXSCREEN); 
    iScrH := GetSystemMetrics(SM_CXSCREEN); 

    if (rectTaskbar.Top > iScrH div 2) and (rectTaskbar.Right >= iScrW) then 
    Result := _BOTTOM 
    else if (rectTaskbar.Top < iScrH div 2) and (rectTaskbar.Bottom <= iScrW div 2) then 
    Result := _TOP 
    else if (rectTaskbar.Left < iScrW div 2) and (rectTaskbar.Top <= 0) then 
    Result := _LEFT 
    else 
    Result := _RIGHT; 

Ils devraient être assez pour résoudre votre problème actuel. Toutefois, si vous avez besoin de connaître (pour une autre raison) les paramètres actuels de la barre des tâches des états autohide et always-on-top, vous pouvez utiliser SHAppBarMessage(ABM_GETSTATE, ...).

Si vous avez besoin d'être averti que l'état de masquage automatique de la barre des tâches ou de l'état toujours actif a changé, vous devez intercepter le message ABN_STATECHANGE.

+0

On dirait que 'SHAppBarMessage (ABM_GETTASKBARPOS, ...)' pourrait être la pièce manquante. http://msdn.microsoft.com/en-us/library/bb762108%28VS.85%29.aspx –

+0

Vous avez raison :-). J'ai ajouté quelques trucs manquants. – Vantomex

+0

Désolé, j'implémente la mise à jour en utilisant Delphi. – Vantomex

Questions connexes