我正在编写一个简单的Windows窗体实用程序来截图整个屏幕或活动窗口并保存文件。winform有一个名为“Capture”的按钮,当单击该按钮时,会截取屏幕截图。
我的代码完全可以在整个屏幕上运行,但不能在活动窗口中运行。
根据我目前的代码,如果我选择“活动窗口”,它最终会打印屏幕显示应用程序本身,这并不是我想要的。
下面是我的代码(在Capture_Click方法下):
try
{
this.Hide();
bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
//bmpScreenshot = new Bitmap(this.Bounds.Width, this.Bounds.Height, PixelFormat.Format32bppArgb);
gfxScreenshot = Graphics.FromImage(bmpScreenshot);
if (AltPrint.Checked)
{
gfxScreenshot.CopyFromScreen(this.Bounds.X, this.Bounds.Y, 0, 0, this.Bounds.Size, CopyPixelOperation.SourceCopy);
}
else
{
gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
}
bmpScreenshot.Save(SaveLocation, ImageFormat.Png);
number++;
}发布于 2011-01-14 23:32:10
据我所知,您的代码使用其自身窗体的边界来捕获“活动”窗口。这可能不是您想要的。
如果你想使用鼠标“打印”一个窗口(而不是热键,这可能更容易实现),你需要能够从你自己的表单让用户指向另一个窗口来捕获。这里有一个想法描述了如何做到这一点:
您可能需要使用P/Invoke来获取有关桌面上所有顶级窗口的信息。
请注意,“鼠标捕捉”与“屏幕捕捉”有很大不同。当应用程序“捕获鼠标”时,它将获得鼠标光标的所有权,并且即使鼠标移动到应用程序窗口的边界之外,它也无法跟踪鼠标。
发布于 2011-01-14 23:39:46
在您的button_Click方法中,要捕获执行捕获的窗口以外的窗口,我所能看到的唯一可能的方法就是使用user32 Windows API。
您首先需要平台调用一些方法,如下所示:
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, GetWindowLongNIndex nIndex);有关这方面的更多信息,我推荐使用www.pinvoke.net/。
下面是我自己的Window类(正在开发中,但可以使用),欢迎您将其用作示例:http://pastebin.com/fj2tEaPY
其中有一些对您有用的属性:
获取AllWindows
TaskbarWindows
ForegroundWindow的
您需要获取当前窗口的句柄(使用get ForegroundWindow,然后使用Handle属性),然后找到想要捕获其图像的窗口,可能使用的代码类似于TaskbarWindows中的代码。一旦你有了窗口,你将需要发送按键Alt + PrtScn (同样可能使用user32 API,但我不会深入讨论)。然后使用static ForegroundWindow属性将原始窗口设置为forground,并使用您在开始时保存的句柄。
祝好运!
发布于 2011-01-14 23:32:47
你的评论似乎明白,一旦你的应用程序获得了焦点(当你点击它时),另一个应用程序就失去了焦点,不再“活跃”。
一种可能的替代方法是:当应用程序获得焦点时,它会收到一条WM_SETFOCUS消息。该消息wParam是刚刚放弃焦点的任何窗口的句柄--该窗口属于您要捕获的应用程序。
当然,该窗口只是一个子窗口或控件,但您可以找出哪个应用程序拥有该按钮。
https://stackoverflow.com/questions/4692441
复制相似问题