Capture screenshot of active window?

前端 未结 11 2230
春和景丽
春和景丽 2020-11-21 23:34

I am making a screen capturing application and everything is going fine. All I need to do is capture the active window and take a screenshot of this active window. Does an

相关标签:
11条回答
  • 2020-11-22 00:22
    Rectangle bounds = Screen.GetBounds(Point.Empty);
    using(Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
    {
        using(Graphics g = Graphics.FromImage(bitmap))
        {
             g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
        }
        bitmap.Save("test.jpg", ImageFormat.Jpeg);
    }
    

    for capturing current window use

     Rectangle bounds = this.Bounds;
     using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
     {
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.CopyFromScreen(new Point(bounds.Left,bounds.Top), Point.Empty, bounds.Size);
        }
        bitmap.Save("C://test.jpg", ImageFormat.Jpeg);
     }
    
    0 讨论(0)
  • 2020-11-22 00:25

    If you want to use managed code: This will capture any window via the ProcessId.

    I used the following to make the window active.

    Microsoft.VisualBasic.Interaction.AppActivate(ProcessId);
    Threading.Thread.Sleep(20);
    

    I used the print screen to capture a window.

    SendKeys.SendWait("%{PRTSC}");
    Threading.Thread.Sleep(40);
    IDataObject objData = Clipboard.GetDataObject();
    
    0 讨论(0)
  • 2020-11-22 00:27

    Here is a snippet to capture either the desktop or the active window. It has no reference to Windows Forms.

    public class ScreenCapture
    {
        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();
    
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern IntPtr GetDesktopWindow();
    
        [StructLayout(LayoutKind.Sequential)]
        private struct Rect
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }   
    
        [DllImport("user32.dll")]
        private static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect);
    
        public static Image CaptureDesktop()
        {
            return CaptureWindow(GetDesktopWindow());
        }
    
        public static Bitmap CaptureActiveWindow()
        {
            return CaptureWindow(GetForegroundWindow());
        }
    
        public static Bitmap CaptureWindow(IntPtr handle)
        {
            var rect = new Rect();
            GetWindowRect(handle, ref rect);
            var bounds = new Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top);
            var result = new Bitmap(bounds.Width, bounds.Height);
    
            using (var graphics = Graphics.FromImage(result))
            {
                graphics.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
            }
    
            return result;
        }
    }
    

    How to capture the whole screen:

    var image = ScreenCapture.CaptureDesktop();
    image.Save(@"C:\temp\snippetsource.jpg", ImageFormat.Jpeg);
    

    How to capture the active window:

    var image = ScreenCapture.CaptureActiveWindow();
    image.Save(@"C:\temp\snippetsource.jpg", ImageFormat.Jpeg);
    

    Originally found here: http://www.snippetsource.net/Snippet/158/capture-screenshot-in-c

    0 讨论(0)
  • 2020-11-22 00:27

    You can use the code from this question: How can I save a screenshot directly to a file in Windows?

    Just change WIN32_API.GetDesktopWindow() to the Handle property of the window you want to capture.

    0 讨论(0)
  • 2020-11-22 00:29

    I assume you use Graphics.CopyFromScreen to get the screenshot.

    You can use P/Invoke to GetForegroundWindow (and then get its position and size) to determine which region you need to copy from.

    0 讨论(0)
提交回复
热议问题