public byte[] captureDesktopBytes() { Win32Functions.RECT windowRect = new Win32Functions.RECT(); IntPtr hWnd = new IntPtr(Win32Functions.GetDesktopWindow()); IntPtr hdcSrc = Win32Functions.GetWindowDC((int)hWnd); Win32Functions.WINDOWINFO window = new Win32Functions.WINDOWINFO(); window.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(window); Win32Functions.GetWindowRect((int)hWnd, ref windowRect); Win32Functions.GetWindowInfo((int)hWnd, ref window); // create a bitmap from the visible clipping bounds of //the graphics object from the window int width = windowRect.right - windowRect.left; int height = windowRect.bottom - windowRect.top; // create a device context we can copy to IntPtr hdcDest = Win32Functions.CreateCompatibleDC(hdcSrc); // create a bitmap we can copy it to, // using GetDeviceCaps to get the width/height IntPtr hBitmap = Win32Functions.CreateCompatibleBitmap(hdcSrc, width, height); //// select the bitmap object IntPtr hOld = Win32Functions.SelectObject(hdcDest, hBitmap); // bitblt over Win32Functions.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, Win32Defines.SRCCOPY); Win32Functions.CURSORINFO ci = new Win32Functions.CURSORINFO(); ci.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(ci); Win32Functions.GetCursorInfo(ref ci); Win32Functions.PICONINFO pi = new Win32Functions.PICONINFO(); Win32Functions.GetIconInfo(ci.hCursor, ref pi); Win32Functions.DrawIconEx(hdcDest, ci.point.x - windowRect.left - pi.xHotSpot, ci.point.y - windowRect.top - pi.yHotSpot, (int)ci.hCursor, 0, 0, 0, 0, 3); Win32Functions.SelectObject(hdcDest, hOld); Win32Functions.ReleaseDC(hWnd, hdcDest); Win32Functions.DeleteDC(hdcDest); Win32Functions.ReleaseDC(hWnd, hdcSrc); byte[] b = new byte[(width * height * 4)]; Win32Functions.GetBitmapBits(hBitmap, (width * height * 4), b); Win32Functions.DeleteObject(hBitmap); return(b); }
public Bitmap captureDesktopBitmap() { Win32Functions.RECT windowRect = new Win32Functions.RECT(); IntPtr hWnd = new IntPtr(Win32Functions.GetDesktopWindow()); IntPtr hdcSrc = Win32Functions.GetWindowDC((int)hWnd); Win32Functions.GetClientRect((int)hWnd, ref windowRect); Win32Functions.WINDOWINFO window = new Win32Functions.WINDOWINFO(); window.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(window); Win32Functions.GetWindowInfo((int)hWnd, ref window); // create a bitmap from the visible clipping bounds of //the graphics object from the window int width = windowRect.right - windowRect.left; int height = windowRect.bottom - windowRect.top; // create a device context we can copy to IntPtr hdcDest = Win32Functions.CreateCompatibleDC(hdcSrc); // create a bitmap we can copy it to, // using GetDeviceCaps to get the width/height IntPtr hBitmap = Win32Functions.CreateCompatibleBitmap(hdcSrc, width, height); // select the bitmap object IntPtr hOld = Win32Functions.SelectObject(hdcDest, hBitmap); // bitblt over Win32Functions.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, window.rcClient.left - window.rcWindow.left, window.rcClient.top - window.rcWindow.top, Win32Defines.SRCCOPY); // restore selection Win32Functions.SelectObject(hdcDest, hOld); // clean up Win32Functions.DeleteDC(hdcDest); Win32Functions.ReleaseDC(hWnd, hdcSrc); // get a .NET Bitmap object for it Bitmap bmp = new Bitmap(Image.FromHbitmap(hBitmap), new Size(width, height)); // free up the Bitmap object Win32Functions.DeleteObject(hBitmap); return(bmp); }
public int GetDesktopWindow() { return(Win32Functions.GetDesktopWindow()); }
/// <summary> /// Callback for the SetHookEx function /// </summary> /// <param name="nCode"></param> /// <param name="wParam"></param> /// <param name="lParam"></param> /// <returns></returns> public int KeyHook(int nCode, IntPtr wParam, IntPtr lParam) { keysChanged = false; if (nCode < 0) { return(Win32Functions.CallNextHookEx(hKeyHook, nCode, wParam, lParam)); } else { int vkCode = Marshal.ReadInt32(lParam); //handle key up/key down if (wParam == (IntPtr)Win32Defines.WM_KEYDOWN || wParam == (IntPtr)Win32Defines.WM_SYSKEYDOWN) { if (vkCode == Key.VK_CONTROL) { ctrlDown = true; } else if (vkCode == Key.VK_SNAPSHOT) { if (!psDown) { psDown = true; keysChanged = true; } } else if (vkCode == Key.VK_ALT) { altDown = true; } } else if (wParam == (IntPtr)Win32Defines.WM_KEYUP || wParam == (IntPtr)Win32Defines.WM_SYSKEYUP) { if (vkCode == Key.VK_CONTROL) { ctrlDown = false; } if (vkCode == Key.VK_SNAPSHOT) { psDown = false; } if (vkCode == Key.VK_ALT) { altDown = false; } } //make sure a key was down to continue... if ((wParam == (IntPtr)Win32Defines.WM_KEYDOWN || wParam == (IntPtr)Win32Defines.WM_SYSKEYDOWN) && canContinue() && vkCode == Key.VK_SNAPSHOT) { Image img = null; if (captureWindow()) { Win32Functions.RECT windowRect = new Win32Functions.RECT(); //get the top level window!! IntPtr hWnd = new IntPtr(Win32Functions.GetForegroundWindow()); IntPtr hdcSrc = Win32Functions.GetWindowDC((int)hWnd); Win32Functions.GetWindowRect((int)hWnd, ref windowRect); // create a bitmap from the visible clipping bounds of //the graphics object from the window int width = windowRect.right - windowRect.left; int height = windowRect.bottom - windowRect.top; // create a device context we can copy to IntPtr hdcDest = Win32Functions.CreateCompatibleDC(hdcSrc); // create a bitmap we can copy it to, // using GetDeviceCaps to get the width/height IntPtr hBitmap = Win32Functions.CreateCompatibleBitmap(hdcSrc, width, height); // select the bitmap object IntPtr hOld = Win32Functions.SelectObject(hdcDest, hBitmap); // bitblt over Win32Functions.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, Win32Defines.SRCCOPY); // restore selection Win32Functions.SelectObject(hdcDest, hOld); // clean up Win32Functions.DeleteDC(hdcDest); Win32Functions.ReleaseDC(hWnd, hdcSrc); // get a .NET image object for it img = Image.FromHbitmap(hBitmap); // free up the Bitmap object Win32Functions.DeleteObject(hBitmap); } else { Win32Functions.RECT windowRect = new Win32Functions.RECT(); //get the top level window!! IntPtr hWnd = new IntPtr(Win32Functions.GetDesktopWindow()); IntPtr hdcSrc = Win32Functions.GetWindowDC((int)hWnd); Win32Functions.GetWindowRect((int)hWnd, ref windowRect); // create a bitmap from the visible clipping bounds of //the graphics object from the window int width = windowRect.right - windowRect.left; int height = windowRect.bottom - windowRect.top; // create a device context we can copy to IntPtr hdcDest = Win32Functions.CreateCompatibleDC(hdcSrc); // create a bitmap we can copy it to, // using GetDeviceCaps to get the width/height IntPtr hBitmap = Win32Functions.CreateCompatibleBitmap(hdcSrc, width, height); // select the bitmap object IntPtr hOld = Win32Functions.SelectObject(hdcDest, hBitmap); // bitblt over Win32Functions.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, Win32Defines.SRCCOPY); // restore selection Win32Functions.SelectObject(hdcDest, hOld); // clean up Win32Functions.DeleteDC(hdcDest); Win32Functions.ReleaseDC(hWnd, hdcSrc); // get a .NET image object for it img = Image.FromHbitmap(hBitmap); // free up the Bitmap object Win32Functions.DeleteObject(hBitmap); } callBack(img); } return(Win32Functions.CallNextHookEx(hKeyHook, nCode, wParam, lParam)); } }