屏幕类,用于全屏程序&显示任务栏

来源:互联网 发布:深圳华夏软件学校招生 编辑:程序博客网 时间:2024/04/30 13:36
 /// <summary>
    /// 屏幕类,用于全屏程序&显示任务栏
    /// </summary>
    public class ScreenHelper
    {
        #region Windows Mobile全屏
        [DllImport("aygshell.dll")]
        public static extern bool SHFullScreen(IntPtr hWnd, uint dwState);


        const uint SHFS_SHOWTASKBAR = 0x1;//任务栏
        const uint SHFS_HIDETASKBAR = 0x2;
        const uint SHFS_SHOWSIPBUTTON = 0x4;//输入法
        const uint SHFS_HIDESIPBUTTON = 0x8;
        const uint SHFS_SHOWSTARTICON = 0x10;//开始菜单栏
        const uint SHFS_HIDESTARTICON = 0x20;


        /// <summary>
        /// 全屏显示,即隐藏WM和win CE的任务栏(和开始菜单栏)
        /// </summary>
        /// <param name="hWnd">要显示的窗体句柄</param>
        /// <param name="isFull">true全屏,false取消全屏</param>
        /// <returns></returns>
        public static bool FullScreen(IntPtr hWnd, bool isFull)
        {
            uint dwState = 0;
            if (isFull)
            {
                dwState = SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON;
            }
            else
            {
                dwState = SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON;
            }
            return SHFullScreen(hWnd, dwState);
        }


        //this.WindowState = FormWindowState.Maximized;//这句不能少,且注意窗体的大小与屏幕相同
        //Win32.FullScreen(this.Handle,true);//本示例在windows mobile 6.1下测试通过
        #endregion


        //Win32 API
        [DllImport("coredll.dll", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lpWindowName, string lpClassName);


        [DllImport("coredll.dll", EntryPoint = "ShowWindow")]
        private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);


        [DllImport("coredll.dll", EntryPoint = "SystemParametersInfo")]
        private static extern int SystemParametersInfo(int uAction, int uParam, ref Rectangle lpvParam, int fuWinIni);


        [DllImport("coredll.dll", EntryPoint = "ShowWindow")]
        public static extern int ShowWindow(int hwnd, int nCmdShow);




        public const int SPI_SETWORKAREA = 47;
        public const int SPI_GETWORKAREA = 48;
        public const int SW_HIDE = 0x00;
        public const int SW_SHOW = 0x0001;
        public const int SPIF_UPDATEINIFILE = 0x01;
        public const int TASKBAR_SW_SHOW = 5; //显示窗口常量 
        public const int TASKBAR_SW_HIDE = 0; //隐藏窗口常量 


        /// <summary>
        /// 隐藏任务栏
        /// </summary>
        /// <param name="FLAG">是否隐藏</param>
        /// <returns></returns>
        public static bool HideTaskBar(bool FLAG)
        {
            int Hwnd = FindWindow("HHTaskBar", null).ToInt32();
            if (Hwnd == 0) return false;
            else
            {
                if (FLAG)
                {
                    ShowWindow(Hwnd, TASKBAR_SW_HIDE);
                }
                else
                {
                    ShowWindow(Hwnd, TASKBAR_SW_SHOW);
                }
            }
            return true;
        }


        /// <summary>
        /// 是否全屏
        /// </summary>
        /// <param name="fullscreen">是否全屏</param>
        /// <param name="rectOld"></param>
        /// <returns></returns>
        public static bool SetFullScreen(bool fullscreen, ref Rectangle rectOld)
        {
            IntPtr Hwnd = FindWindow("HHTaskBar", null);
            if (Hwnd == IntPtr.Zero) return false;
            if (fullscreen)
            {
                ShowWindow(Hwnd, SW_HIDE);
                Rectangle rectFull = Screen.PrimaryScreen.Bounds;
                SystemParametersInfo(SPI_GETWORKAREA, 0, ref rectOld, SPIF_UPDATEINIFILE);//get SystemParametersInfo(SPI_SETWORKAREA, 0, ref rectFull, SPIF_UPDATEINIFILE);//set
            }
            else
            {
                ShowWindow(Hwnd, SW_SHOW);
                SystemParametersInfo(SPI_SETWORKAREA, 0, ref rectOld, SPIF_UPDATEINIFILE);
            }
            return true;
        }


        /// <summary>
        /// 屏幕居中
        /// </summary>
        /// <param name="f"></param>
        /// <returns></returns>
        public static bool CenterScreen(Form f)
        {
            Rectangle ScreenArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
            f.Left = (ScreenArea.Width - f.Width) / 2;
            f.Top = (ScreenArea.Height - f.Height) / 2;
            return true;
        }


        public static bool CenterControl(Control child, Control parent)
        {
            child.Left = (parent.Width - child.Width) / 2;
            child.Top = (parent.Height - child.Height) / 2;
            return true;
        }


        public static Size GetScreenSize()
        {
            Rectangle rectFull = Screen.PrimaryScreen.Bounds;
            return new Size(rectFull.Width, rectFull.Height);
        }


        #region 屏幕像素计算
        static ScreenHelper()
        {
            Init();
        }


        private static double InchesToMMUnit = 25.4;
        private static double ScreenDPI_X = 102.8;
        private static double ScreenDPI_Y = 102.8;


        private static void Init()
        {
#if Computer
            using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
            {
                ScreenDPI_X = graphics.DpiX;
                ScreenDPI_Y = graphics.DpiY;
            }
#endif
        }


        //[DllImport("user32.dll")]
        //static extern IntPtr GetDC(IntPtr ptr);


        //[DllImport("user32.dll", EntryPoint = "ReleaseDC")]
        //public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);


        //[DllImport("gdi32.dll")]
        //private static extern int GetDeviceCaps(IntPtr hdc, int Index);
        //private static void Init()
        //{
        //    IntPtr screenDC = GetDC(IntPtr.Zero);
        //    int width = GetDeviceCaps(screenDC, 4);     // 毫米宽度 
        //    int pixels = GetDeviceCaps(screenDC, 8);     // 像素
        //    ReleaseDC(IntPtr.Zero, screenDC);


        //    double vDpi = pixels / width;
        //    ScreenDPI_X = vDpi * InchesToMMUnit;
        //    ScreenDPI_Y = vDpi * InchesToMMUnit;
        //}


        /// <summary>
        /// 毫米转为像素(注:dpi分水平和垂直,获取方法为得到 Graphics 的实例化对象 g,调用g.DpiX、g.DpiY)
        /// </summary>
        /// <param name="mm">毫米</param>
        /// <param name="fDPI">分辨率(水平/垂直)</param>
        /// <returns></returns>
        public static double MillimetersToPixel(double mm, double fDPI)
        {
            //毫米转像素:mm * dpi / 25.4 
            return mm * fDPI / InchesToMMUnit;
        }


        /// <summary>
        /// 根据毫米获取屏幕像素
        /// </summary>
        /// <param name="mm"></param>
        /// <returns></returns>
        public static int MillimetersToPixel(double mm)
        {
            return (int)Math.Round(MillimetersToPixel(mm, ScreenDPI_X), 0);
        }


        /// <summary>
        /// 像素转为毫米(注:dpi分水平和垂直,获取方法为得到 Graphics 的实例化对象 g,调用g.DpiX、g.DpiY)
        /// </summary>
        /// <param name="px">像素</param>
        /// <param name="fDPI">分辨率(水平/垂直)</param>
        /// <returns></returns>
        public static double PixelToMillimeters(double px, double fDPI)
        {
            //像素转毫米:px * 25.4 / dpi
            return px * InchesToMMUnit / fDPI;
        }


        /// <summary>
        /// 根据像素获取毫米
        /// </summary>
        /// <param name="px">像素</param>
        /// <returns></returns>
        public static double PixelToMillimeters(double px)
        {
            return PixelToMillimeters(px, ScreenDPI_X);
        }


        /// <summary>
        /// 英寸到像素
        /// </summary>
        /// <param name="inches"></param>
        /// <returns></returns>
        public static double InchesToPixels(double inches, double fDPI)
        {
            return inches * fDPI;
        }


        /// <summary>
        /// 像素到英寸
        /// </summary>
        /// <param name="px"></param>
        /// <returns></returns>
        public static double PixelsToInches(double px, double fDPI)
        {
            return px / fDPI;
        }


        /// <summary>
        /// 毫米到英寸
        /// </summary>
        /// <param name="mm"></param>
        /// <returns></returns>
        public static double MillimetersToInches(double mm)
        {
            return mm / InchesToMMUnit;
        }


        /// <summary>
        /// 英寸到毫米
        /// </summary>
        /// <param name="mm"></param>
        /// <returns></returns>
        public static double InchesToMillimeters(double Inches)
        {
            return Inches * InchesToMMUnit;
        }
        #endregion
    }
1 0
原创粉丝点击