1

で本当に奇妙な問題が発生しSHAppBarMessageています。数時間さまざまなことを試していますが、うまくいきません。TaskBar の位置を取得しようとしています。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 メンバーを持つ構造体へのポインター。このメッセージを送信するときは、と を指定する必要があります。他のすべてのメンバーは無視されます。cbSizehWnd

鉱山を強調します。

この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 に答える