using System.Drawing.Imaging; using System.Runtime.InteropServices; namespace OSD { public class OSDNativeForm : NativeWindow, IDisposable { private bool _disposed = false; private byte _alpha = 250; private Size _size = new Size(350, 50); private Point _location = new Point(50, 50); protected virtual void PerformPaint(PaintEventArgs e) { } protected internal void Invalidate() { this.UpdateLayeredWindow(); } private void UpdateLayeredWindow() { Bitmap bitmap1 = new Bitmap(this.Size.Width, this.Size.Height, PixelFormat.Format32bppArgb); using (Graphics graphics1 = Graphics.FromImage(bitmap1)) { Rectangle rectangle1; SIZE size1; POINT point1; POINT point2; BLENDFUNCTION blendfunction1; rectangle1 = new Rectangle(0, 0, this.Size.Width, this.Size.Height); PerformPaint(new PaintEventArgs(graphics1, rectangle1)); IntPtr ptr1 = User32.GetDC(IntPtr.Zero); IntPtr ptr2 = Gdi32.CreateCompatibleDC(ptr1); IntPtr ptr3 = bitmap1.GetHbitmap(Color.FromArgb(0)); IntPtr ptr4 = Gdi32.SelectObject(ptr2, ptr3); size1.cx = this.Size.Width; size1.cy = this.Size.Height; point1.x = this.Location.X; point1.x = this.Location.X; point1.y = this.Location.Y; point2.x = 0; point2.y = 0; blendfunction1 = new BLENDFUNCTION(); blendfunction1.BlendOp = 0; blendfunction1.BlendFlags = 0; blendfunction1.SourceConstantAlpha = this._alpha; blendfunction1.AlphaFormat = 1; User32.UpdateLayeredWindow(base.Handle, ptr1, ref point1, ref size1, ptr2, ref point2, 0, ref blendfunction1, 2); //2=ULW_ALPHA Gdi32.SelectObject(ptr2, ptr4); User32.ReleaseDC(IntPtr.Zero, ptr1); Gdi32.DeleteObject(ptr3); Gdi32.DeleteDC(ptr2); } } public virtual void Show() { if (base.Handle == IntPtr.Zero) //if handle don't equal to zero - window was created and just hided this.CreateWindowOnly(); User32.ShowWindow(base.Handle, User32.SW_SHOWNOACTIVATE); } public virtual void Hide() { if (base.Handle == IntPtr.Zero) return; User32.ShowWindow(base.Handle, User32.SW_HIDE); this.DestroyHandle(); } public virtual void Close() { this.Hide(); this.Dispose(); } private void CreateWindowOnly() { CreateParams params1 = new CreateParams(); params1.Caption = "FloatingNativeWindow"; int nX = this._location.X; int nY = this._location.Y; Screen screen1 = Screen.FromHandle(base.Handle); if ((nX + this._size.Width) > screen1.Bounds.Width) { nX = screen1.Bounds.Width - this._size.Width; } if ((nY + this._size.Height) > screen1.Bounds.Height) { nY = screen1.Bounds.Height - this._size.Height; } this._location = new Point(nX, nY); Size size1 = this._size; Point point1 = this._location; params1.X = nX; params1.Y = nY; params1.Height = size1.Height; params1.Width = size1.Width; params1.Parent = IntPtr.Zero; uint ui = User32.WS_POPUP; params1.Style = (int)ui; params1.ExStyle = User32.WS_EX_TOPMOST | User32.WS_EX_TOOLWINDOW | User32.WS_EX_LAYERED | User32.WS_EX_NOACTIVATE | User32.WS_EX_TRANSPARENT; this.CreateHandle(params1); this.UpdateLayeredWindow(); } protected virtual void SetBoundsCore(int x, int y, int width, int height) { if (((this.X != x) || (this.Y != y)) || ((this.Width != width) || (this.Height != height))) { if (base.Handle != IntPtr.Zero) { int num1 = 20; if ((this.X == x) && (this.Y == y)) { num1 |= 2; } if ((this.Width == width) && (this.Height == height)) { num1 |= 1; } User32.SetWindowPos(base.Handle, IntPtr.Zero, x, y, width, height, (uint)num1); } else { this.Location = new Point(x, y); this.Size = new Size(width, height); } } } #region # Properties # /// /// Get or set position of top-left corner of floating native window in screen coordinates /// public virtual Point Location { get { return this._location; } set { if (base.Handle != IntPtr.Zero) { this.SetBoundsCore(value.X, value.Y, this._size.Width, this._size.Height); RECT rect = new RECT(); User32.GetWindowRect(base.Handle, ref rect); this._location = new Point(rect.left, rect.top); this.UpdateLayeredWindow(); } else { this._location = value; } } } /// /// Get or set size of client area of floating native window /// public virtual Size Size { get { return this._size; } set { if (base.Handle != IntPtr.Zero) { this.SetBoundsCore(this._location.X, this._location.Y, value.Width, value.Height); RECT rect = new RECT(); User32.GetWindowRect(base.Handle, ref rect); this._size = new Size(rect.right - rect.left, rect.bottom - rect.top); this.UpdateLayeredWindow(); } else { this._size = value; } } } /// /// Gets or sets the height of the floating native window /// public int Height { get { return this._size.Height; } set { this._size = new Size(this._size.Width, value); } } /// /// Gets or sets the width of the floating native window /// public int Width { get { return this._size.Width; } set { this._size = new Size(value, this._size.Height); } } /// /// Get or set x-coordinate of top-left corner of floating native window in screen coordinates /// public int X { get { return this._location.X; } set { this.Location = new Point(value, this.Location.Y); } } /// /// Get or set y-coordinate of top-left corner of floating native window in screen coordinates /// public int Y { get { return this._location.Y; } set { this.Location = new Point(this.Location.X, value); } } /// /// Get rectangle represented client area of floating native window in client coordinates(top-left corner always has coord. 0,0) /// public Rectangle Bound { get { return new Rectangle(new Point(0, 0), this._size); } } /// /// Get or set full opacity(255) or full transparency(0) or any intermediate state for floating native window transparency /// public byte Alpha { get { return this._alpha; } set { if (this._alpha == value) return; this._alpha = value; this.UpdateLayeredWindow(); } } #endregion #region IDisposable Members public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (!this._disposed) { this.DestroyHandle(); this._disposed = true; } } #endregion } #region # Win32 # [StructLayout(LayoutKind.Sequential)] internal struct POINT { public int x; public int y; } [StructLayout(LayoutKind.Sequential)] internal struct RECT { public int left; public int top; public int right; public int bottom; } [StructLayout(LayoutKind.Sequential)] internal struct SIZE { public int cx; public int cy; } [StructLayout(LayoutKind.Sequential)] internal struct TRACKMOUSEEVENTS { public uint cbSize; public uint dwFlags; public IntPtr hWnd; public uint dwHoverTime; } [StructLayout(LayoutKind.Sequential)] internal struct MSG { public IntPtr hwnd; public int message; public IntPtr wParam; public IntPtr lParam; public int time; public int pt_x; public int pt_y; } [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct BLENDFUNCTION { public byte BlendOp; public byte BlendFlags; public byte SourceConstantAlpha; public byte AlphaFormat; } internal class User32 { public const uint WS_POPUP = 0x80000000; public const int WS_EX_TOPMOST = 0x8; public const int WS_EX_TOOLWINDOW = 0x80; public const int WS_EX_LAYERED = 0x80000; public const int WS_EX_TRANSPARENT = 0x20; public const int WS_EX_NOACTIVATE = 0x08000000; public const int SW_SHOWNOACTIVATE = 4; public const int SW_HIDE = 0; public const uint AW_HOR_POSITIVE = 0x1; public const uint AW_HOR_NEGATIVE = 0x2; public const uint AW_VER_POSITIVE = 0x4; public const uint AW_VER_NEGATIVE = 0x8; public const uint AW_CENTER = 0x10; public const uint AW_HIDE = 0x10000; public const uint AW_ACTIVATE = 0x20000; public const uint AW_SLIDE = 0x40000; public const uint AW_BLEND = 0x80000; // Methods private User32() { } [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool AnimateWindow(IntPtr hWnd, uint dwTime, uint dwFlags); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool ClientToScreen(IntPtr hWnd, ref POINT pt); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool DispatchMessage(ref MSG msg); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool DrawFocusRect(IntPtr hWnd, ref RECT rect); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr GetDC(IntPtr hWnd); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr GetFocus(); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern ushort GetKeyState(int virtKey); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool GetMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr GetParent(IntPtr hWnd); [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern bool GetClientRect(IntPtr hWnd, [In, Out] ref RECT rect); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr GetWindow(IntPtr hWnd, int cmd); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool HideCaret(IntPtr hWnd); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool InvalidateRect(IntPtr hWnd, ref RECT rect, bool erase); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr LoadCursor(IntPtr hInstance, uint cursor); [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern int MapWindowPoints(IntPtr hWndFrom, IntPtr hWndTo, [In, Out] ref RECT rect, int cPoints); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool PeekMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax, uint wFlag); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool PostMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool ReleaseCapture(); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool ScreenToClient(IntPtr hWnd, ref POINT pt); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern uint SendMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr SetCursor(IntPtr hCursor); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr SetFocus(IntPtr hWnd); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int newLong); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndAfter, int X, int Y, int Width, int Height, uint flags); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool redraw); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool ShowCaret(IntPtr hWnd); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool SetCapture(IntPtr hWnd); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern int ShowWindow(IntPtr hWnd, short cmdShow); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref int bRetValue, uint fWinINI); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool TrackMouseEvent(ref TRACKMOUSEEVENTS tme); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool TranslateMessage(ref MSG msg); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref POINT pptDst, ref SIZE psize, IntPtr hdcSrc, ref POINT pprSrc, int crKey, ref BLENDFUNCTION pblend, int dwFlags); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool UpdateWindow(IntPtr hwnd); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool WaitMessage(); [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern bool AdjustWindowRectEx(ref RECT lpRect, int dwStyle, bool bMenu, int dwExStyle); } internal class Gdi32 { // Methods private Gdi32() { } [DllImport("gdi32.dll", CharSet = CharSet.Auto)] internal static extern int CombineRgn(IntPtr dest, IntPtr src1, IntPtr src2, int flags); [DllImport("gdi32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr CreateBrushIndirect(ref LOGBRUSH brush); [DllImport("gdi32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr CreateCompatibleDC(IntPtr hDC); [DllImport("gdi32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr CreateRectRgnIndirect(ref RECT rect); [DllImport("gdi32.dll", CharSet = CharSet.Auto)] internal static extern bool DeleteDC(IntPtr hDC); [DllImport("gdi32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr DeleteObject(IntPtr hObject); [DllImport("gdi32.dll", CharSet = CharSet.Auto)] internal static extern int GetClipBox(IntPtr hDC, ref RECT rectBox); [DllImport("gdi32.dll", CharSet = CharSet.Auto)] internal static extern bool PatBlt(IntPtr hDC, int x, int y, int width, int height, uint flags); [DllImport("gdi32.dll", CharSet = CharSet.Auto)] internal static extern int SelectClipRgn(IntPtr hDC, IntPtr hRgn); [DllImport("gdi32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); } [StructLayout(LayoutKind.Sequential)] public struct LOGBRUSH { public uint lbStyle; public uint lbColor; public uint lbHatch; } #endregion }