首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅PrintScreen活动窗口

仅PrintScreen活动窗口
EN

Stack Overflow用户
提问于 2011-01-14 23:07:28
回答 6查看 7.2K关注 0票数 1

我正在编写一个简单的Windows窗体实用程序来截图整个屏幕或活动窗口并保存文件。winform有一个名为“Capture”的按钮,当单击该按钮时,会截取屏幕截图。

我的代码完全可以在整个屏幕上运行,但不能在活动窗口中运行。

根据我目前的代码,如果我选择“活动窗口”,它最终会打印屏幕显示应用程序本身,这并不是我想要的。

下面是我的代码(在Capture_Click方法下):

代码语言:javascript
复制
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++;
        }
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-14 23:32:10

据我所知,您的代码使用其自身窗体的边界来捕获“活动”窗口。这可能不是您想要的。

如果你想使用鼠标“打印”一个窗口(而不是热键,这可能更容易实现),你需要能够从你自己的表单让用户指向另一个窗口来捕获。这里有一个想法描述了如何做到这一点:

  1. 当用户按下" capture“按钮时,捕获鼠标并启动拖动操作。
  2. 允许用户将鼠标(可能现在有一个”靶眼“或”相机“光标)拖到要捕获的窗口。
  3. 当用户释放鼠标时,确定它位于顶部的窗口,并使用此窗口的位置和大小来捕获正确的像素。

您可能需要使用P/Invoke来获取有关桌面上所有顶级窗口的信息。

请注意,“鼠标捕捉”与“屏幕捕捉”有很大不同。当应用程序“捕获鼠标”时,它将获得鼠标光标的所有权,并且即使鼠标移动到应用程序窗口的边界之外,它也无法跟踪鼠标。

票数 1
EN

Stack Overflow用户

发布于 2011-01-14 23:39:46

在您的button_Click方法中,要捕获执行捕获的窗口以外的窗口,我所能看到的唯一可能的方法就是使用user32 Windows API。

您首先需要平台调用一些方法,如下所示:

代码语言:javascript
复制
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, GetWindowLongNIndex nIndex);

有关这方面的更多信息,我推荐使用www.pinvoke.net/

下面是我自己的Window类(正在开发中,但可以使用),欢迎您将其用作示例:http://pastebin.com/fj2tEaPY

其中有一些对您有用的属性:

获取AllWindows

  • get TaskbarWindows

  • set ForegroundWindow

您需要获取当前窗口的句柄(使用get ForegroundWindow,然后使用Handle属性),然后找到想要捕获其图像的窗口,可能使用的代码类似于TaskbarWindows中的代码。一旦你有了窗口,你将需要发送按键Alt + PrtScn (同样可能使用user32 API,但我不会深入讨论)。然后使用static ForegroundWindow属性将原始窗口设置为forground,并使用您在开始时保存的句柄。

祝好运!

票数 2
EN

Stack Overflow用户

发布于 2011-01-14 23:32:47

你的评论似乎明白,一旦你的应用程序获得了焦点(当你点击它时),另一个应用程序就失去了焦点,不再“活跃”。

一种可能的替代方法是:当应用程序获得焦点时,它会收到一条WM_SETFOCUS消息。该消息wParam是刚刚放弃焦点的任何窗口的句柄--该窗口属于您要捕获的应用程序。

当然,该窗口只是一个子窗口或控件,但您可以找出哪个应用程序拥有该按钮。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4692441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档