2016-08-15 80 views
0
public void toggleAutoHide() 
{ 
    APPBARDATA data = new APPBARDATA.ByReference(); 
    data.hWnd = hWndGlobal; 
    data.cbSize.setValue(data.size()); 
    data.lParam.setValue(Shell32.INSTANCE.SHAppBarMessage(new DWORD(ShellAPI.ABM_GETSTATE), data).longValue()); 
    data.lParam.setValue(data.lParam.intValue()^0x0000001); 
    UINT_PTR result = Shell32.INSTANCE.SHAppBarMessage(new DWORD(ShellAPI.ABM_SETSTATE), data); 
} 

我上面說的代碼應該自動隱藏創建的appbar,但不知何故,而不是這樣做是爲了我創建實際的吧,它實際上改變主Windows任務欄的狀態。任何線索我錯過了什麼步驟?SHAppBarMessage和自動隱藏

編輯:

我已經修改了代碼,改變了電話,但我得到了相同的值的時候,不管是什麼我設置的值。

public void toggleAutoHide() 
    { 
     APPBARDATA data = new APPBARDATA.ByReference(); 
     data.hWnd = hWndGlobal; 
     data.cbSize.setValue(data.size()); 
     data.uEdge.setValue(ShellAPI.ABE_TOP); 
     System.out.println("LParam [byte, int]: " + data.lParam.byteValue() + " -- " + data.lParam.intValue()); 
     //lParam always shows 0 
     if(data.lParam.intValue() == 1) 
     { 
      data.lParam.setValue(0); 
     } 
     else 
     { 
      data.lParam.setValue(1); 
     } 

     UINT_PTR result = Shell32.INSTANCE.SHAppBarMessage(new DWORD(ShellAPI.ABM_SETAUTOHIDEBAR), data); 
     System.out.println("Result = " + result.intValue()); //always returns 1 
    } 

回答

0

ABM_SETSTATE呼叫使用data.hWnd變量來決定哪個窗口句柄得到更改。您將其分配給變量hWndGlobal的值,但不解釋來自哪裏。

它被命名爲「全局」的事實似乎暗示了代碼中早些時候在代碼中給出了Windows任務欄的值。追捕那份作業。

你可能想是這樣的:

data.hWnd = User32.INSTANCE.FindWindowA(null, "Title of your new appbar"); 
+0

我找到了分配,並通過你上面使用賦值語句指定hWndGlobal。但是我得到了同樣的行爲。我試圖通過FindWindowA方法明確地設置它,但仍然是相同的行爲。還有什麼我失蹤? –

+0

仔細檢查一下,它看起來像ABM_SETSTATE總是適用於主任務欄。你看過[ABM_SETAUTOHIDEBAR](https://msdn.microsoft.com/en-us/library/windows/desktop/bb787957(v = vs.85).aspx)或其相關函數嗎?此外,你可以顯然只有一個自動隱藏欄的每個屏幕邊緣... –

+0

我修改了代碼並放置了一條調試語句。它似乎總是在lParam字段中顯示值0。 (上面的編輯) –