public static TaskbarState GetWinTaskbarState()
        {
            APPBARDATA ABD = new APPBARDATA();
            TaskbarState retState = new TaskbarState();
            var hwnd = User32.FindWindow(ClassName, null);

            ABD.cbSize = Marshal.SizeOf(ABD);
            ABD.uEdge = 0;
            ABD.hWnd = hwnd;
            ABD.lParam = 1;

            RECT scaledTaskbarRect;
            User32.GetWindowRect(hwnd, out scaledTaskbarRect);

            var taskbarNonDPIAwareSize = Shell32.SHAppBarMessage((int)ABMsg.ABM_GETTASKBARPOS, ref ABD);

            var scalingAmount = (double)(scaledTaskbarRect.bottom - scaledTaskbarRect.top) / (ABD.rc.bottom - ABD.rc.top);

            retState.TaskbarSize = default(RECT);
            retState.TaskbarSize.top = (int)(ABD.rc.top * scalingAmount);
            retState.TaskbarSize.bottom = (int)(ABD.rc.bottom * scalingAmount);
            retState.TaskbarSize.left = (int)(ABD.rc.left * scalingAmount);
            retState.TaskbarSize.right = (int)(ABD.rc.right * scalingAmount);

            var screen = Screen.AllScreens.FirstOrDefault(x => x.Bounds.Contains(
                            new Rectangle(
                                retState.TaskbarSize.left,
                                retState.TaskbarSize.top,
                                retState.TaskbarSize.right - retState.TaskbarSize.left,
                                retState.TaskbarSize.bottom - retState.TaskbarSize.top)
                         ));

            retState.TaskbarPosition = TaskbarPosition.Bottom;

            if (screen != null)
            {
                if (retState.TaskbarSize.bottom == screen.Bounds.Bottom && retState.TaskbarSize.top == screen.Bounds.Top)
                {
                    retState.TaskbarPosition = (retState.TaskbarSize.left == screen.Bounds.Left) ? TaskbarPosition.Left : TaskbarPosition.Right;
                }
                if (retState.TaskbarSize.right == screen.Bounds.Right && retState.TaskbarSize.left == screen.Bounds.Left)
                {
                    retState.TaskbarPosition = (retState.TaskbarSize.top == screen.Bounds.Top) ? TaskbarPosition.Top : TaskbarPosition.Bottom;
                }
            }

            return retState;
        }
 public static extern IntPtr SHAppBarMessage(uint dwMessage, [In] ref APPBARDATA pData);