我想编写一个放大屏幕中间的程序,所以我使用了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的速率刷新,导致它口吃。
要清楚,我的想法是放大屏幕中间,然后在屏幕中间的正方形中显示放大的图像(正方形外的区域将保留其原始大小)。
答案 0 :(得分:0)
捕获初始图像时,通过在同一区域上绘制一个矩形,将与表单内部对应的区域空白。您可以通过Form
获取窗口位置和尺寸,并在捕获图像的该部分上绘制矩形。