private IntPtr WindowProcedure(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam) { switch (msg) { case WindowMessage.EraseBackground: User32.SendMessage(hwnd, WindowMessage.Paint, (IntPtr)0, (IntPtr)0); break; case WindowMessage.Keyup: case WindowMessage.Keydown: case WindowMessage.Syscommand: case WindowMessage.Syskeydown: case WindowMessage.Syskeyup: return((IntPtr)0); case WindowMessage.NcPaint: case WindowMessage.Paint: return((IntPtr)0); case WindowMessage.DwmCompositionChanged: WindowHelper.ExtendFrameIntoClientArea(hwnd); return((IntPtr)0); case WindowMessage.DpiChanged: return((IntPtr)0); // block DPI changed message default: break; } return(User32.DefWindowProc(hwnd, msg, wParam, lParam)); }
/// <summary> /// Makes the window visible. /// </summary> public void Show() { if (!_isInitialized) { throw new InvalidOperationException("OverlayWindow not initialized"); } User32.ShowWindow(_handle, ShowWindowCommand.Show); _isVisible = true; WindowHelper.ExtendFrameIntoClientArea(_handle); OnVisibilityChanged(true); }
private void RemoveTopmost() { if (!_isTopmost) { return; } WindowHelper.RemoveTopmost(_handle); _isTopmost = false; if (_isVisible) { WindowHelper.ExtendFrameIntoClientArea(_handle); } }
/// <summary> /// Changes the size of the window using the given width and height. /// </summary> /// <param name="width">The new width of the window.</param> /// <param name="height">The new height of the window.</param> public void Resize(int width, int height) { if (!_isInitialized) { throw new InvalidOperationException("OverlayWindow not initialized"); } User32.MoveWindow(_handle, _x, _y, width, height, true); _width = width; _height = height; WindowHelper.ExtendFrameIntoClientArea(_handle); OnSizeChanged(width, height); }
/// <summary> /// Changes the position of the window using the given coordinates. /// </summary> /// <param name="x">The new x-coordinate of the window.</param> /// <param name="y">The new y-coordinate of the window.</param> public void Move(int x, int y) { if (!_isInitialized) { throw new InvalidOperationException("OverlayWindow not initialized"); } User32.MoveWindow(_handle, x, y, _width, _height, true); _x = x; _y = y; WindowHelper.ExtendFrameIntoClientArea(_handle); OnPositionChanged(x, y); }
private void MakeTopmost() { if (_isTopmost) { return; } WindowHelper.MakeTopmost(_handle); _isTopmost = true; if (!_isVisible) { WindowHelper.ExtendFrameIntoClientArea(_handle); _isVisible = true; OnVisibilityChanged(true); } }
private void SetupWindow() { // generate a random title if it's null (invalid) if (_title == null) { _title = WindowHelper.GenerateRandomTitle(); } if (string.IsNullOrEmpty(MenuName)) { MenuName = WindowHelper.GenerateRandomTitle(); } // if no class name is given then generate a "unique" one if (string.IsNullOrEmpty(_className)) { _className = WindowHelper.GenerateRandomClass(); } // prepare window procedure _windowProc = WindowProcedure; _windowProcAddress = Marshal.GetFunctionPointerForDelegate(_windowProc); // try to register our class while (true) { var wndClassEx = new WindowClassEx { Size = WindowClassEx.NativeSize(), Style = 0, WindowProc = _windowProcAddress, ClsExtra = 0, WindowExtra = 0, Instance = IntPtr.Zero, Icon = IntPtr.Zero, Curser = IntPtr.Zero, Background = IntPtr.Zero, MenuName = MenuName, ClassName = _className, IconSm = IntPtr.Zero }; if (User32.RegisterClassEx(ref wndClassEx) != 0) { break; } else { // already taken name? _className = WindowHelper.GenerateRandomClass(); } } var extendedWindowStyle = ExtendedWindowStyle.Transparent | ExtendedWindowStyle.Layered | ExtendedWindowStyle.NoActivate; if (_isTopmost) { extendedWindowStyle |= ExtendedWindowStyle.Topmost; } var windowStyle = WindowStyle.Popup; if (_isVisible) { windowStyle |= WindowStyle.Visible; } _handle = User32.CreateWindowEx( extendedWindowStyle, _className, _title, windowStyle, _x, _y, _width, _height, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); User32.SetLayeredWindowAttributes(_handle, 0, 255, LayeredWindowAttributes.Alpha); User32.UpdateWindow(_handle); // if the window is incompatible on some platforms then use // SetWindowLong and UpdateWindow to set the style again and // call SetWindowPos with SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED if (_isVisible) { WindowHelper.ExtendFrameIntoClientArea(_handle); } }