2010-10-26 36 views
0

我想在窗口底部放置一個窗口。如果開始菜單存在,我希望它位於開始菜單的頂部。如果不是(或者它是自動隱藏的),我仍然希望它的位置與開始菜單的位置相同,這意味着會有幾個像素的間隙。win32:檢測開始菜單是否自動隱藏?

目前,我得到了監視器工作區,將窗口放在底部,並總是偏移20像素左右。如果開始菜單不存在,這可以很好地工作。但是,如果是這樣,工作區域也會縮小(因爲它應該),並且我最終會實現雙重抵消。

我該如何解決這個問題?

回答

0

您是否在您的項目中使用或有權訪問.NET?

如果是這樣,您可以使用Screen.PrimaryScreen.WorkingArea.Height屬性來確定不包括任務欄的屏幕底部。

您還可以通過獲取Screen.PrimaryScreen.Bounds.Height屬性(其中包括總高度值中的任務欄)來獲取總屏幕高度。

比較這些值,如果它們相同,任務欄不存在。否則,任務欄是,您可以相應地進行調整。

+0

嗯我沒有.NET,但我可能能夠得到老派的win32 api調用信息.. – Claudiu 2010-10-26 17:33:38

+0

我認爲即使它隱藏任務欄也需要幾個像素。當任務欄不存在時,你如何獲得它的高度,以便可以減去它? – 2010-10-27 04:01:32

+0

好點..我只是假設標準的win98爲主題的一個單位高的任務欄 – Claudiu 2010-10-28 20:45:39

2

爲了獲得不是由系統任務欄或應用程序的桌面工具欄遮擋屏幕的工作區,你可以使用SystemParametersInfo()SPI_GETWORKAREAuiAction參數。參數必須指向接收工作區座標的結構,用虛擬屏幕座標表示。例如:

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

當您在評論說,讓任務欄的邊框,我們可以調用SHAppBarMessage(ABM_GETTASKBARPOS, ...)

要確定在任務欄的位置(當前是否處於底部,您可以使用以下計算:

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; 

它們應該足以解決您當前的問題。但是,如果您需要知道(出於其他原因)自動隱藏和始終處於頂部狀態的當前任務欄設置,則可以使用SHAppBarMessage(ABM_GETSTATE, ...)

如果需要通知任務欄的自動隱藏或始終在頂狀態已更改,則必須攔截ABN_STATECHANGE消息。

+0

看起來像'SHAppBarMessage(ABM_GETTASKBARPOS,...)'可能是缺少的一塊。 http://msdn.microsoft.com/en-us/library/bb762108%28VS.85%29.aspx – 2010-10-27 04:08:14

+0

你是對的:-)。我添加了一些丟失的東西。 – Vantomex 2010-10-27 04:57:51

+0

對不起,我使用Delphi實現更新。 – Vantomex 2010-10-27 05:04:33