guys, have you tried using UpdateLayeredWindow API?
am not sure why it doesn't work. meaning.. just a blank layered window ..
public void MakeEXLAYERED(IntPtr hWnd) { // add WS_EX_LAYERED and WS_EX_TRANSPARENT extended style in our form int _initialexstyle = Win32.GetWindowLong(hWnd, Win32.GWL_EXSTYLE); Win32.SetWindowLong(hWnd, Win32.GWL_EXSTYLE, _initialexstyle | Win32.WS_EX_LAYERED | Win32.WS_EX_TANSPARENT); } public void SetBitmap(IntPtr hWnd, Point location, Bitmap bitmap, byte opacity) { //if (bitmap.PixelFormat != PixelFormat.Format32bppArgb) // throw new ApplicationException("The bitmap must be 32ppp with alpha-channel."); IntPtr screenDc = Win32.GetDC(IntPtr.Zero); System.Diagnostics.Debug.WriteLine("screenDc: " + screenDc); IntPtr memDc = Win32.CreateCompatibleDC(screenDc); System.Diagnostics.Debug.WriteLine("memDc: " + memDc); IntPtr hBitmap = IntPtr.Zero; IntPtr oldBitmap = IntPtr.Zero; try { hBitmap = bitmap.GetHbitmap(); // grab a GDI handle from this GDI+ bitmap System.Diagnostics.Debug.WriteLine("hBitmap: " + hBitmap); oldBitmap = Win32.SelectObject(memDc, hBitmap); System.Diagnostics.Debug.WriteLine("oldBitmap: " + oldBitmap); Win32.Size size = new Win32.Size(bitmap.Width, bitmap.Height); Win32.Point pointSource = new Win32.Point(0, 0); Win32.Point topPos = new Win32.Point(location.X, location.Y); Win32.BLENDFUNCTION blend = new Win32.BLENDFUNCTION(); blend.BlendOp = Win32.AC_SRC_OVER; blend.BlendFlags = 0; blend.SourceConstantAlpha = opacity; blend.AlphaFormat = Win32.AC_SRC_ALPHA; Win32.Bool success = Win32.UpdateLayeredWindow(hWnd, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, Win32.ULW_ALPHA); if(success == Win32.Bool.False) System.Diagnostics.Debug.WriteLine("failed to blend"); } finally { Win32.ReleaseDC(IntPtr.Zero, screenDc); if (hBitmap != IntPtr.Zero) { Win32.SelectObject(memDc, oldBitmap); //Windows.DeleteObject(hBitmap); // The documentation says that we have to use the Windows.DeleteObject... but since there is no such method I use the normal DeleteObject from Win32 GDI and it's working fine without any resource leak. Win32.DeleteObject(hBitmap); } Win32.DeleteDC(memDc); } }
Bitmap must be an PNG image with alphablend