1

我有一个非常奇怪的问题SHAppBarMessage,现在已经尝试了几个小时不同的东西,但我没有得到它。我正在尝试获取任务栏位置。它在 Windows 8 上运行良好,但在 Windows Server 上返回值为SHAppBarMessage.

答案中的以下代码在 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;
    }

我完全没有想法。因为它应该按原样工作。但我不知道为什么它不起作用。我错过了什么吗?

眼见为实

4

1 回答 1

2

根据以下文档ABM_GETTASKBARPOS

fResult = (BOOL) SHAppBarMessage(ABM_GETTASKBARPOS, pabd);

pabd

指向APPBARDATA结构的指针,其 rc 成员接收任务栏的屏幕坐标中的边界矩形。您必须在发送此消息时指定cbSizeand ;hWnd所有其他成员都被忽略。

强调我的。

这个Delphi 代码示例同样建议,它会查找一个名为的窗口Shell_TrayWnd

// 'Shell_TrayWnd' is the name of the task bar's window
AppData.Hwnd := FindWindow('Shell_TrayWnd', nil);
于 2013-11-30T10:04:47.180 回答