コード例 #1
0
        /// <summary>
        /// The window proc.
        /// </summary>
        /// <param name="hwnd">
        /// The hwnd.
        /// </param>
        /// <param name="umsg">
        /// The umsg.
        /// </param>
        /// <param name="wParam">
        /// The w param.
        /// </param>
        /// <param name="lParam">
        /// The l param.
        /// </param>
        /// <returns>
        /// The <see cref="IntPtr"/>.
        /// </returns>
        private IntPtr WindowProc(IntPtr hwnd, uint umsg, IntPtr wParam, IntPtr lParam)
        {
            var msg = (WM)umsg;

            switch (msg)
            {
            case WM.ACTIVATE:
            {
                if (_hostConfig.HostPlacement.Frameless)
                {
                    var frameSizeY   = User32Methods.GetSystemMetrics(SystemMetrics.SM_CYFRAME);
                    var frameSizeX   = User32Methods.GetSystemMetrics(SystemMetrics.SM_CXFRAME);
                    var frameMargins = new Margins(frameSizeX, frameSizeX, frameSizeY, frameSizeY);
                    DwmApiMethods.DwmExtendFrameIntoClientArea(Handle, ref frameMargins);
                    User32Methods.SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, WindowPositionFlags.SWP_NOZORDER | WindowPositionFlags.SWP_NOOWNERZORDER | WindowPositionFlags.SWP_NOMOVE | WindowPositionFlags.SWP_NOSIZE | WindowPositionFlags.SWP_FRAMECHANGED);
                }
                break;
            }

            case WM.CREATE:
            {
                Handle = hwnd;
                var size = GetClientSize();
                OnCreate(hwnd, size.Width, size.Height);
                break;
            }

            case WM.ERASEBKGND:
                return(new IntPtr(1));

            case WM.SIZE:
            {
                var size = GetClientSize();
                OnSize(size.Width, size.Height);
                break;
            }

            case WM.CLOSE:
            {
                OnExit();
                Exit();
                Environment.Exit(0);
                break;
            }

            case WM.NCHITTEST:
                if (_hostConfig.HostPlacement.Frameless)
                {
                    return((IntPtr)NativeMethods.HT_CAPTION);
                }
                break;
            }

            return(User32Methods.DefWindowProc(hwnd, umsg, wParam, lParam));
        }
コード例 #2
0
        void UpdateGeom( )
        {
            var hwnd = ThreadWindowHandles.FindWindow( "Shell_TrayWnd" , null );
            RECT rect = new RECT();

            if ( User32Methods.IsWindowVisible( hwnd )  )
            {
                ThreadWindowHandles.SystemParametersInfoGet( ( uint )SystemParametersDesktopInfo.SPI_GETWORKAREA , 0 ,
                    ref rect , ( uint )SystemParamtersInfoFlags.None );
                ScreenGeom = rect;
            }
            else
            {
                int sx = User32Methods.GetSystemMetrics( SystemMetrics.SM_XVIRTUALSCREEN );
                int sy = User32Methods.GetSystemMetrics( SystemMetrics.SM_YVIRTUALSCREEN );
                int sw = User32Methods.GetSystemMetrics( SystemMetrics.SM_CXVIRTUALSCREEN );
                int sh = User32Methods.GetSystemMetrics( SystemMetrics.SM_CYVIRTUALSCREEN );
                ScreenGeom = new RECT( sx , sy , sw , sh );
            }
            // 固定値
            BarHeight = 20;
            int wy = ScreenGeom.Top;
            int wh = ScreenGeom.Height;
            BarY = -BarHeight;
            {
                if ( TopBar )
                {
                    wy = ScreenGeom.Top + BarHeight;
                    BarY = wy - BarHeight;
                }
                else
                {
                    BarY = wy + wh;
                }
                wh = ScreenGeom.Height - BarHeight;
            }
            // ここ全体 TileWindowManagerに持っていきたい
            WindowManager.ScreenGeom = ScreenGeom;
        }