示例#1
0
        private static void ABSetPos(AppBarPosition edge, Window appbarWindow)
        {
            APPBARDATA barData = new APPBARDATA();

            barData.cbSize = Marshal.SizeOf(barData);
            appbarWindow.Dispatcher.Invoke(new Action(() => {
                barData.hWnd = new WindowInteropHelper(appbarWindow).Handle;
            }));
            barData.uEdge = (int)edge;

            if (barData.uEdge == (int)AppBarPosition.Left || barData.uEdge == (int)AppBarPosition.Right)
            {
                barData.rc.top    = 0;
                barData.rc.bottom = (int)SystemParameters.PrimaryScreenHeight;
                if (barData.uEdge == (int)AppBarPosition.Left)
                {
                    barData.rc.left  = 0;
                    barData.rc.right = (int)Math.Round(appbarWindow.ActualWidth);
                }
                else
                {
                    barData.rc.right = (int)SystemParameters.PrimaryScreenWidth;
                    barData.rc.left  = barData.rc.right - (int)Math.Round(appbarWindow.ActualWidth);
                }
            }
            else
            {
                barData.rc.left  = 0;
                barData.rc.right = (int)SystemParameters.PrimaryScreenWidth;
                if (barData.uEdge == (int)AppBarPosition.Top)
                {
                    barData.rc.top    = 0;
                    barData.rc.bottom = (int)Math.Round(appbarWindow.ActualHeight);
                }
                else
                {
                    barData.rc.bottom = (int)SystemParameters.PrimaryScreenHeight;
                    barData.rc.top    = barData.rc.bottom - (int)Math.Round(appbarWindow.ActualHeight);
                }
            }

            SHAppBarMessage((int)ABMsg.ABM_QUERYPOS, ref barData);
            SHAppBarMessage((int)ABMsg.ABM_SETPOS, ref barData);

            Rect rect = new Rect((double)barData.rc.left, (double)barData.rc.top,
                                 (double)(barData.rc.right - barData.rc.left), (double)(barData.rc.bottom - barData.rc.top));

            //This is done async, because WPF will send a resize after a new appbar is added.
            //if we size right away, WPFs resize comes last and overrides us.
            appbarWindow.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle,
                                                new ResizeDelegate(DoResize), appbarWindow, rect);
        }
示例#2
0
        public static void SetAppBar(Window appbarWindow, AppBarPosition edge)
        {
            RegisterInfo info = GetRegisterInfo(appbarWindow);

            info.Edge = edge;

            APPBARDATA abd = new APPBARDATA();

            abd.cbSize = Marshal.SizeOf(abd);
            appbarWindow.Dispatcher.Invoke(new Action(() => {
                abd.hWnd = new WindowInteropHelper(appbarWindow).Handle;
            }));
            if (edge == AppBarPosition.None)
            {
                if (info.IsRegistered)
                {
                    SHAppBarMessage((int)ABMsg.ABM_REMOVE, ref abd);
                    info.IsRegistered = false;
                }
                RestoreWindow(appbarWindow);
                return;
            }

            if (!info.IsRegistered)
            {
                info.IsRegistered    = true;
                info.CallbackId      = RegisterWindowMessage("AppBarMessage");
                abd.uCallbackMessage = info.CallbackId;

                uint ret = SHAppBarMessage((int)ABMsg.ABM_NEW, ref abd);

                HwndSource source = null;
                appbarWindow.Dispatcher.Invoke(new Action(() => {
                    source = HwndSource.FromHwnd(abd.hWnd);
                }));
                source.AddHook(new HwndSourceHook(info.WndProc));
            }


            appbarWindow.Dispatcher.Invoke(new Action(() => {
                appbarWindow.WindowStyle = WindowStyle.None;
                appbarWindow.ResizeMode  = ResizeMode.NoResize;
                appbarWindow.Topmost     = true;
            }));

            ABSetPos(info.Edge, appbarWindow);
        }
示例#3
0
        private static void ABSetPos(AppBarPosition edge, Window appbarWindow) {
            APPBARDATA barData = new APPBARDATA();
            barData.cbSize = Marshal.SizeOf(barData);
            appbarWindow.Dispatcher.Invoke(new Action(() => {
                barData.hWnd = new WindowInteropHelper(appbarWindow).Handle;
            }));
            barData.uEdge = (int)edge;

            if (barData.uEdge == (int)AppBarPosition.Left || barData.uEdge == (int)AppBarPosition.Right) {
                barData.rc.top = 0;
                barData.rc.bottom = (int)SystemParameters.PrimaryScreenHeight;
                if (barData.uEdge == (int)AppBarPosition.Left) {
                    barData.rc.left = 0;
                    barData.rc.right = (int)Math.Round(appbarWindow.ActualWidth);
                } else {
                    barData.rc.right = (int)SystemParameters.PrimaryScreenWidth;
                    barData.rc.left = barData.rc.right - (int)Math.Round(appbarWindow.ActualWidth);
                }
            } else {
                barData.rc.left = 0;
                barData.rc.right = (int)SystemParameters.PrimaryScreenWidth;
                if (barData.uEdge == (int)AppBarPosition.Top) {
                    barData.rc.top = 0;
                    barData.rc.bottom = (int)Math.Round(appbarWindow.ActualHeight);
                } else {
                    barData.rc.bottom = (int)SystemParameters.PrimaryScreenHeight;
                    barData.rc.top = barData.rc.bottom - (int)Math.Round(appbarWindow.ActualHeight);
                }
            }

            SHAppBarMessage((int)ABMsg.ABM_QUERYPOS, ref barData);
            SHAppBarMessage((int)ABMsg.ABM_SETPOS, ref barData);

            Rect rect = new Rect((double)barData.rc.left, (double)barData.rc.top,
                (double)(barData.rc.right - barData.rc.left), (double)(barData.rc.bottom - barData.rc.top));
            //This is done async, because WPF will send a resize after a new appbar is added.  
            //if we size right away, WPFs resize comes last and overrides us.
            appbarWindow.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle,
                new ResizeDelegate(DoResize), appbarWindow, rect);
        }
示例#4
0
        public static void SetAppBar(Window appbarWindow, AppBarPosition edge) {
            RegisterInfo info = GetRegisterInfo(appbarWindow);
            info.Edge = edge;

            APPBARDATA abd = new APPBARDATA();
            abd.cbSize = Marshal.SizeOf(abd);
            appbarWindow.Dispatcher.Invoke(new Action(() => {
                abd.hWnd = new WindowInteropHelper(appbarWindow).Handle;
            }));
            if (edge == AppBarPosition.None) {
                if (info.IsRegistered) {
                    SHAppBarMessage((int)ABMsg.ABM_REMOVE, ref abd);
                    info.IsRegistered = false;
                }
                RestoreWindow(appbarWindow);
                return;
            }

            if (!info.IsRegistered) {
                info.IsRegistered = true;
                info.CallbackId = RegisterWindowMessage("AppBarMessage");
                abd.uCallbackMessage = info.CallbackId;

                uint ret = SHAppBarMessage((int)ABMsg.ABM_NEW, ref abd);

                HwndSource source = null;
                appbarWindow.Dispatcher.Invoke(new Action(() => {
                    source = HwndSource.FromHwnd(abd.hWnd);
                }));
                source.AddHook(new HwndSourceHook(info.WndProc));
                
            }


            appbarWindow.Dispatcher.Invoke(new Action(() => {
                appbarWindow.WindowStyle = WindowStyle.None;
                appbarWindow.ResizeMode = ResizeMode.NoResize;
                appbarWindow.Topmost = true;
            }));

            ABSetPos(info.Edge, appbarWindow);

        }