using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace Cosmos.CommonManager { /// /// FormDisplayTricker /// public class FormDisplayTricker { private static FormEx layerForm = null; private static Timer timer = null; private static bool isReadConfig = false; private static bool isUseFormDisplayTricker = false; private static string FormDisplayTrickerName = "DisplayTrickerForm"; /// SetLayer public static void SetLayer(Form topControl) { try { if (false == IsUseFormDisplayTricker()) return; FormEx form = GetLayerForm(); Image img = ScreenCaptureOpacityForm.GetScreen(); form.BackgroundImage = img; form.Location = new Point(0, form.Height * -1 - 1); form.Show(); form.Refresh(); form.Location = new Point(0, 0); timer.Interval = 50; timer.Start(); } catch (Exception ex) { RemoveLayer(); } } /// RemoveLayer public static void RemoveLayer() { if (false == IsUseFormDisplayTricker()) return; if (timer != null) timer.Stop(); Form form = GetLayerForm(); if (form == null) return; form.Hide(); } private static bool IsUseFormDisplayTricker() { if (isReadConfig) return isUseFormDisplayTricker; isReadConfig = true; try { if (System.Diagnostics.Process.GetCurrentProcess().ProcessName.EndsWith(".vshost", StringComparison.OrdinalIgnoreCase)) // 디버깅으로 실행되면 사용안함 { isUseFormDisplayTricker = false; } else { //string iniFilaName = System.IO.Path.Combine(Application.StartupPath, ".\\Application.INI"); //System.Xml.XmlDocument xdoc = new System.Xml.XmlDocument(); //xdoc.Load(iniFilaName); //var node = xdoc.DocumentElement.SelectSingleNode("performance/display_tricker"); //if (node != null) // isUseFormDisplayTricker = node.InnerText == "1"; isUseFormDisplayTricker = true; } } catch { isUseFormDisplayTricker = false; } return isUseFormDisplayTricker; } private static FormEx GetLayerForm() { if (layerForm == null || layerForm.IsDisposed) { layerForm = new FormEx(); layerForm.FormBorderStyle = FormBorderStyle.None; layerForm.StartPosition = FormStartPosition.Manual; layerForm.Opacity = 0.9999999999; layerForm.Location = new Point(0, 0); layerForm.Size = new Size(1024, 768); layerForm.ShowInTaskbar = false; layerForm.TopMost = true; layerForm.Name = FormDisplayTrickerName; timer = new Timer(); timer.Tick += timer_Tick; timer.Interval = 50; } return layerForm; } private static void timer_Tick(object sender, EventArgs e) { FormDisplayTricker.RemoveLayer(); } /// FormEx public class FormEx : Form { /// FormEx public FormEx() { base.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw, true); } /// OnDeactivate protected override void OnDeactivate(EventArgs e) { //base.OnDeactivate(e); this.Activate(); } /// OnLostFocus protected override void OnLostFocus(EventArgs e) { base.OnLostFocus(e); } /// OnPaint protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); } /// OnPaintBackground protected override void OnPaintBackground(PaintEventArgs e) { base.OnPaintBackground(e); } } /// ScreenCaptureOpacityForm public class ScreenCaptureOpacityForm { /// GetScreen public static Image GetScreen() { Size sz = Screen.PrimaryScreen.Bounds.Size; IntPtr hDesk = GetDesktopWindow(); IntPtr hSrce = GetWindowDC(hDesk); IntPtr hDest = CreateCompatibleDC(hSrce); IntPtr hBmp = CreateCompatibleBitmap(hSrce, sz.Width, sz.Height); IntPtr hOldBmp = SelectObject(hDest, hBmp); bool b = BitBlt(hDest, 0, 0, sz.Width, sz.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt); Bitmap bmp = Bitmap.FromHbitmap(hBmp); SelectObject(hDest, hOldBmp); DeleteObject(hBmp); DeleteDC(hDest); ReleaseDC(hDesk, hSrce); return bmp; } // P/Invoke declarations [DllImport("gdi32.dll")] static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop); [DllImport("user32.dll")] static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc); [DllImport("gdi32.dll")] static extern IntPtr DeleteDC(IntPtr hDc); [DllImport("gdi32.dll")] static extern IntPtr DeleteObject(IntPtr hDc); [DllImport("gdi32.dll")] static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); [DllImport("gdi32.dll")] static extern IntPtr CreateCompatibleDC(IntPtr hdc); [DllImport("gdi32.dll")] static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); /// GetDesktopWindow [DllImport("user32.dll")] public static extern IntPtr GetDesktopWindow(); /// GetWindowDC [DllImport("user32.dll")] public static extern IntPtr GetWindowDC(IntPtr ptr); } } }