我对SHAppBarMessage
有一个非常奇怪的问题,现在已经尝试了几个小时不同的东西,但我没有得到它。我想获得TaskBar的位置。它在Windows 8上运行正常但在Windows Server上的返回值为SHAppBarMessage
。
来自an answer的以下代码在Windows 8上运行良好,但在Windows 2008R2上它有一种奇怪的行为。
public static System.Drawing.Rectangle GetTaskbarPosition()
{
var data = new APPBARDATA();
data.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(data);
IntPtr retval = SHAppBarMessage(ABM_GETTASKBARPOS, ref data);
if (retval == IntPtr.Zero) throw new Exception("Please re-install Windows");
return new System.Drawing.Rectangle(data.rc.left, data.rc.top,
data.rc.right - data.rc.left, data.rc.bottom - data.rc.top);
}
// P/Invoke goo:
private const int ABM_GETTASKBARPOS = 5;
[System.Runtime.InteropServices.DllImport("shell32.dll")]
private static extern IntPtr SHAppBarMessage(int msg, ref APPBARDATA data);
private struct APPBARDATA
{
public int cbSize;
public IntPtr hWnd;
public int uCallbackMessage;
public int uEdge;
public RECT rc;
public IntPtr lParam;
}
private struct RECT
{
public int left, top, right, bottom;
}
我完全没有想法。因为它应该工作原样。但我不知道为什么它不起作用。我错过了什么吗?
答案 0 :(得分:2)
根据the documentation for ABM_GETTASKBARPOS
:
fResult = (BOOL) SHAppBarMessage(ABM_GETTASKBARPOS, pabd);
pabd
指向
APPBARDATA
结构的指针,其结构的rc成员接收任务栏的屏幕坐标中的边界矩形。 发送此邮件时,您必须指定cbSize
和hWnd
;所有其他成员都被忽略了。
强调我的。
This Delphi代码示例同样建议,它会查找名为Shell_TrayWnd
的窗口:
// 'Shell_TrayWnd' is the name of the task bar's window
AppData.Hwnd := FindWindow('Shell_TrayWnd', nil);