SHAppBarMessage和AutoHide

时间:2016-08-15 19:33:45

标签: java jna

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任务栏的状态。有什么线索我错过了什么?

修改

我修改了代码并更改了调用,但无论我将值设置为什么,我都会一直得到相同的值。

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
    }

1 个答案:

答案 0 :(得分:0)

ABM_SETSTATE调用正在使用您的data.hWnd变量来决定哪个窗口句柄获取您的更改。您可以将该值分配给变量hWndGlobal,但不解释它的来源。

它被命名为“全局”的事实似乎意味着代码中的某个地方早些时候给了它Windows Windows任务栏的值。追捕那项任务。

您可能需要以下内容:

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