internal void Close() { if (Region != IntPtr.Zero) { Gdi32.SetWindowRgn(Handle, IntPtr.Zero, false); Gdi32.DeleteObject(Region); } User32.CloseWindow(_handle); User32.SetParent((int)_handle, 0); User32.DestroyWindow(_handle); }
private void DrawToLayeredWindow() { RECT rect = new RECT(); User32.GetWindowRect(_handle, ref rect); int width = rect.right - rect.left; int height = rect.bottom - rect.top; if (width == 0 || height == 0) { return; } POINT newLocation = new POINT(rect.left, rect.top); SIZE newSize = new SIZE(width, height); IntPtr screenDc = User32.GetDC(IntPtr.Zero); IntPtr memDc = Gdi32.CreateCompatibleDC(screenDc); using (Bitmap bmp = GetBitmap(width, height)) { IntPtr hBitmap = bmp.GetHbitmap(_transparent); IntPtr hOldBitmap = Gdi32.SelectObject(memDc, hBitmap); User32.UpdateLayeredWindow(_handle, screenDc, ref newLocation, ref newSize, memDc, ref _ptZero, 0, ref _blend, 0x02); User32.ReleaseDC(IntPtr.Zero, screenDc); if (hBitmap != IntPtr.Zero) { Gdi32.SelectObject(memDc, hOldBitmap); Gdi32.DeleteObject(hBitmap); } } Gdi32.DeleteDC(memDc); GC.Collect(); }
public IntPtr GetDC(Message msg) { IntPtr res = IntPtr.Zero; if (msg.Msg == (int)WindowsMessages.WM_NCPAINT) { int flags = (int)DCX.DCX_CACHE | (int)DCX.DCX_CLIPSIBLINGS | (int)DCX.DCX_WINDOW | (int)DCX.DCX_VALIDATE; IntPtr hrgnCopy = IntPtr.Zero; if (msg.WParam != Win32.TRUE) { flags |= (int)DCX.DCX_INTERSECTRGN; hrgnCopy = Gdi32.CreateRectRgn(0, 0, 1, 1); Gdi32.CombineRgn(hrgnCopy, msg.WParam, IntPtr.Zero, Gdi32.RGN_COPY); } res = User32.GetDCEx(Handle, hrgnCopy, flags); return(res); } return(User32.GetWindowDC(Handle)); }