如何捕获屏幕并忽略图像中的特定窗口

时间:2017-10-05 16:12:28

标签: c# screenshot

我想编写一个放大屏幕中间的程序,所以我使用了user32.dll中的一些方法。我设法让我的程序捕获屏幕并以60FPS的速率刷新图片框上的图像,但是当我想要实时显示更大的图像时,程序还会捕获我的表单,显示更大的图像,从而导致无限图像循环内的图像。我想捕捉屏幕并忽略我的表格,它显示更大的图像。

我想到了一些事情,比如我将窗口的句柄传递给我想要忽略的东西,除了我指定的窗口外,它会捕获任何东西。这是我现在的代码:

override func viewDidLayoutSubviews() {
    self.autocompleteTableView = UITableView(frame: CGRect(x: 
    self.storeSearchBar.frame.origin.x, y: self.storeSearchBar.frame.origin.y + self.storeSearchBar.frame.size.height, width: self.storeSearchBar.bounds.width, height: 200.0))
    self.autocompleteTableView!.alpha = 0.8
    self.autocompleteTableView!.delegate = self
    self.autocompleteTableView!.dataSource = self
    self.autocompleteTableView!.separatorStyle = .none
    if #available(iOS 11.0, *) {
        self.autocompleteTableView!.insetsContentViewsToSafeArea = true
    }

    self.storeSearchBar.alpha = 0.8
    self.storeSearchBar.delegate = self
    self.view.addSubview(self.autocompleteTableView!)
    self.autocompleteTableView!.isHidden = true

    let searchBar = self.storeSearchBar!
    searchBar.barTintColor = UIColor.white
    searchBar.sizeToFit()
}

我传递的句柄来自这个方法:

Bitmap CaptureWindow(IntPtr handle)
{
    IntPtr hdcSrc = User32.GetWindowDC(handle);
    User32.RECT windowRect = new User32.RECT();
    User32.GetWindowRect(handle, ref windowRect);
    int width = windowRect.right - windowRect.left;
    int height = windowRect.bottom - windowRect.top;
    IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
    IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
    IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);

    GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
    GDI32.SelectObject(hdcDest, hOld);
    GDI32.DeleteDC(hdcDest);
    User32.ReleaseDC(handle, hdcSrc);

    Bitmap img = null;
    try
    {
        img = new Bitmap(Image.FromHbitmap(hBitmap), 1920 * 2, 1080 * 2);              
        using (Graphics g = Graphics.FromImage(img))
        {
            g.FillRectangle(Brushes.White, new Rectangle(0, 0, 200, 1080));//img.Width - (img.Height/2), img.Height));
            // g.FillRectangle(Brushes.White, new Rectangle(img.Width - (img.Height / 2) + img.Height, 0, img.Width - img.Height / 2, img.Height));
        }
        GDI32.DeleteObject(hBitmap);            
    }
    catch (Exception e)
    { }
    return img;
}

我已经尝试过这个解决方案:How can i capture the screen without the Form? 但它不能很好地工作,因为图片框以60Hz的速率刷新,导致它口吃。

要清楚,我的想法是放大屏幕中间,然后在屏幕中间的正方形中显示放大的图像(正方形外的区域将保留其原始大小)。

1 个答案:

答案 0 :(得分:0)

捕获初始图像时,通过在同一区域上绘制一个矩形,将与表单内部对应的区域空白。您可以通过Form获取窗口位置和尺寸,并在捕获图像的该部分上绘制矩形。