【问题标题】:Issue with SHAppBarMessage for TaskBar Position on Windows Server 2008R2Windows Server 2008R2 上任务栏位置的 SHAppBarMessage 问题
【发布时间】:2013-11-30 09:42:01
【问题描述】:

我对@9​​87654324@ 有一个非常奇怪的问题,我已经尝试了几个小时不同的事情,但我没有得到它。我正在尝试获取任务栏位置。它在 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;
    }

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

【问题讨论】:

  • 您是否尝试过重新安装 Windows?
  • No not尚未尝试先弄清楚。
  • 不知道是不是默认,但是pinvoke.net在APPBARDATAAPPBARDATApinvoke.net/default.aspx/shell32/APPBARDATA.html上有一个StructLayoutAttribute
  • 我也尝试过,事实上最初我的电话是使用 StructLayout。正如我所说,一直在研究它,所以我已经尝试了所有可能想到的东西或通过互联网找到它。
  • 如果你明确地在 AnyCPU/x86/x64 架构上运行它会发生什么?

标签: .net c#-4.0 windows-server-2008-r2 taskbar shell32


【解决方案1】:

根据the documentation for ABM_GETTASKBARPOS

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

pabd

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

强调我的。

This Delphi 代码示例同样建议,它会查找名称为 Shell_TrayWnd 的窗口:

// 'Shell_TrayWnd' is the name of the task bar's window
AppData.Hwnd := FindWindow('Shell_TrayWnd', nil);

【讨论】:

  • 是的,应该提供 hWnd,但没有收获。我现在越来越相信这是操作系统安装问题。某些东西可能已损坏。但是感谢您的坚持。
猜你喜欢
  • 2012-04-10
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多