/// <summary> /// Take a SnapShot of the application window /// </summary> /// <Remark> /// http://www.codeproject.com/script/articles/list_articles.asp?userid=634640 ///</Remark> /// <param name="AppWndHandle"></param> /// <param name="IsClientWnd"></param> /// <param name="nCmdShow"></param> /// <returns>Bitmap of application window </returns> private static Bitmap TakeAppWndSnapShot(IntPtr AppWndHandle, bool IsClientWnd, ChessWin32API.WindowShowStyle nCmdShow) { if (AppWndHandle == IntPtr.Zero || !ChessWin32API.IsWindow(AppWndHandle) || !ChessWin32API.IsWindowVisible(AppWndHandle)) return null; if (ChessWin32API.IsIconic(AppWndHandle)) ChessWin32API.ShowWindow(AppWndHandle, nCmdShow); //show it if (!ChessWin32API.SetForegroundWindow(AppWndHandle)) return null; //can't bring it to front System.Threading.Thread.Sleep(1000); //give it some time to redraw RECT appRect; bool res = IsClientWnd ? ChessWin32API.GetClientRect(AppWndHandle, out appRect) : ChessWin32API.GetWindowRect(AppWndHandle, out appRect); if (!res || appRect.Height == 0 || appRect.Width == 0) { return null; //some hidden window } if (IsClientWnd) { Point lt = new Point(appRect.Left, appRect.Top); Point rb = new Point(appRect.Right, appRect.Bottom); ChessWin32API.ClientToScreen(AppWndHandle, ref lt); ChessWin32API.ClientToScreen(AppWndHandle, ref rb); appRect.Left = lt.X; appRect.Top = lt.Y; appRect.Right = rb.X; appRect.Bottom = rb.Y; } // Intersect with the Desktop rectangle and get what's visible IntPtr DesktopHandle = ChessWin32API.GetDesktopWindow(); RECT desktopRect; ChessWin32API.GetWindowRect(DesktopHandle, out desktopRect); RECT visibleRect; if (!ChessWin32API.IntersectRect(out visibleRect, ref desktopRect, ref appRect)) { visibleRect = appRect; } if (ChessWin32API.IsRectEmpty(ref visibleRect)) return null; int Width = visibleRect.Width; int Height = visibleRect.Height; IntPtr hdcTo = IntPtr.Zero; IntPtr hdcFrom = IntPtr.Zero; IntPtr hBitmap = IntPtr.Zero; try { Bitmap clsRet = null; // get device context of the window... hdcFrom = IsClientWnd ? ChessWin32API.GetDC(AppWndHandle) : ChessWin32API.GetWindowDC(AppWndHandle); // create dc that we can draw to... hdcTo = ChessWin32API.CreateCompatibleDC(hdcFrom); hBitmap = ChessWin32API.CreateCompatibleBitmap(hdcFrom, Width, Height); // validate... if (hBitmap != IntPtr.Zero) { // copy... int x = appRect.Left < 0 ? -appRect.Left : 0; int y = appRect.Top < 0 ? -appRect.Top : 0; IntPtr hLocalBitmap = ChessWin32API.SelectObject(hdcTo, hBitmap); ChessWin32API.BitBlt(hdcTo, 0, 0, Width, Height, hdcFrom, x, y, ChessWin32API.SRCCOPY); ChessWin32API.SelectObject(hdcTo, hLocalBitmap); // create bitmap for window image... clsRet = System.Drawing.Image.FromHbitmap(hBitmap); } //MessageBox.Show(string.Format("rect ={0} \n deskrect ={1} \n visiblerect = {2}",rct,drct,VisibleRCT)); //return... return clsRet; } finally { // release ... if (hdcFrom != IntPtr.Zero) ChessWin32API.ReleaseDC(AppWndHandle, hdcFrom); if (hdcTo != IntPtr.Zero) ChessWin32API.DeleteDC(hdcTo); if (hBitmap != IntPtr.Zero) ChessWin32API.DeleteObject(hBitmap); } }
internal static extern bool EnumThreadWindows(uint dwThreadId, ChessWin32API.EnumThreadDelegate lpfn, IntPtr lParam);