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
}
答案 0 :(得分:0)
ABM_SETSTATE调用正在使用您的data.hWnd
变量来决定哪个窗口句柄获取您的更改。您可以将该值分配给变量hWndGlobal
,但不解释它的来源。
它被命名为“全局”的事实似乎意味着代码中的某个地方早些时候给了它Windows Windows任务栏的值。追捕那项任务。
您可能需要以下内容:
data.hWnd = User32.INSTANCE.FindWindowA(null, "Title of your new appbar");