gpt4 book ai didi

c# - 如何获取包含调用窗口的屏幕截图(在 XP 上)

转载 作者:太空宇宙 更新时间:2023-11-03 22:00:42 25 4
gpt4 key购买 nike

我有截取屏幕截图的代码...

Size ssSize;
int ssX, ssY, ssWidth, ssHeight;
Bitmap thisScreenshot;
Graphics gfxScreenshot;

public Image Screenshot()
{
ssX = Screen.PrimaryScreen.Bounds.X;
ssY = Screen.PrimaryScreen.Bounds.Y;
ssWidth = Screen.PrimaryScreen.Bounds.Width;
ssHeight = Screen.PrimaryScreen.Bounds.Height;
ssSize = Screen.PrimaryScreen.Bounds.Size;
thisScreenshot = new Bitmap(ssWidth,ssHeight);
gfxScreenshot = Graphics.FromImage(thisScreenshot);
return((Image)gfxScreenshot.CopyFromScreen(ssX, ssY, 0, 0, ssSize));
}

在 W7 上,生成的图像包括调用窗口的像素;但在 XP 上它没有。我希望图像始终包含调用进程/窗口。知道如何强制执行此操作吗?

更新 1:我对此做了更多的实验,结果我更加困惑......我采用上面的代码并创建了一个完全独立的应用程序,因此它与我最初启动它的应用程序之间没有任何关系。奇怪的是,我仍然没有在屏幕截图中看到该应用程序的窗口。所以现在我在做截图的过程和我想包含在截图中的窗口之间没有关系;然而,该窗口仍未包括在内。我确实尝试了 PRNT-SCRN 按钮,它确实包含了窗口。请注意,这只是 XP 上的问题。

最佳答案

将表单的不透明度属性设置为 100,然后右键单击 TransparencyKey 属性并选择重置。这确保您的窗口不再是分层窗口,并且不会从屏幕截图中丢失。

如果您想保留这些属性,则必须解决 Graphics.CopyFromScreen() 中的错误。捕获分层窗口需要使用 CopyPixelOperation 和 CaptureBlt 操作的重载。但由于参数验证代码中的错误而无法工作。解决方法不是很好但很实用:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
Size sz = Screen.PrimaryScreen.Bounds.Size;
IntPtr hDesk = GetDesktopWindow();
IntPtr hSrce = GetWindowDC(hDesk);
IntPtr hDest = CreateCompatibleDC(hSrce);
IntPtr hBmp = CreateCompatibleBitmap(hSrce, sz.Width, sz.Height);
IntPtr hOldBmp = SelectObject(hDest, hBmp);
bool b = BitBlt(hDest, 0, 0, sz.Width, sz.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt);
Bitmap bmp = Bitmap.FromHbitmap(hBmp);
SelectObject(hDest, hOldBmp);
DeleteObject(hBmp);
DeleteDC(hDest);
ReleaseDC(hDesk, hSrce);
bmp.Save(@"c:\temp\test.png");
bmp.Dispose();
}

// P/Invoke declarations
[DllImport("gdi32.dll")]
static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int
wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop);
[DllImport("user32.dll")]
static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteDC(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteObject(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll")]
static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr ptr);
}
}

关于c# - 如何获取包含调用窗口的屏幕截图(在 XP 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10233055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com