c# - 为什么这个 C# 方法不能生成正确的屏幕截图?
问题描述
我想保存标题以- Scrivener
PNG 文件结尾的窗口快照。为此,我编写了以下方法(基于此答案):
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left; // x position of upper-left corner
public int Top; // y position of upper-left corner
public int Right; // x position of lower-right corner
public int Bottom; // y position of lower-right corner
}
private void button1_Click(object sender, EventArgs e)
{
Process[] processes = Process.GetProcesses();
Process scrivenerProcess = null;
foreach (Process curProcess in processes)
{
Console.WriteLine("Name: " + curProcess.ProcessName + ", title: " + curProcess.MainWindowTitle);
if (curProcess.MainWindowTitle.EndsWith("- Scrivener"))
{
scrivenerProcess = curProcess;
break;
}
}
if (scrivenerProcess == null)
{
Console.WriteLine("Scrivener not found");
return;
}
var rect = new RECT();
GetWindowRect(new HandleRef(this, scrivenerProcess.MainWindowHandle), out rect);
int width = rect.Right - rect.Left;
int height = rect.Bottom - rect.Top;
var bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics graphics = Graphics.FromImage(bmp);
graphics.CopyFromScreen(rect.Left, rect.Top, 0, 0, new System.Drawing.Size(width, height), CopyPixelOperation.SourceCopy);
bmp.Save("C:\\usr\\dp\\ref\\marcomm\\2020_04_22_wordCounter\\2020-04-24-TestScreenshot.png", ImageFormat.Png);
Console.WriteLine("Heyo!");
}
这段代码有几个问题:
首先,如果我在调用该代码时要捕获的应用程序(Scrivener)不在前台,则生成的屏幕截图为空。
其次,如果 Scrivener 窗口在前台,我会得到父窗口的屏幕截图(见下文)。
我如何需要更改我的代码才能使其
一种。即使窗口不在前台也可以工作
湾。只捕获字数统计窗口(不是它的父窗口)?
这是代码。
解决方案
这是你的问题:
scrivenerProcess.MainWindowHandle
从文档中:
主窗口是当前拥有焦点的进程打开的窗口
在您的屏幕截图中,您之后的窗口没有焦点(它有一个带有灰色文本的白色背景,表明它处于非活动状态)。
不幸的是,要枚举进程的其他窗口,您需要使用 P/Invoke,因为它们没有通过Process
类公开。使用EnumWindows
或EnumChildWindows
。
推荐阅读
- xpages - 如何使用密码运行 nhttp.exe?
- angular - 从服务中为提供商获取价值
- highcharts - Highstock 中的 PivotPoints R & S 交替颜色
- ruby - API POST 请求返回 404 route not found
- android - 编译器抱怨类型错误,但显然是正确的
- sql-server - SQL Server 还原错误:文件“db.mdf”的目录查找失败
- r - 按标题值对列进行排序
- javascript - 如何仅使用 Javascript 将 HTML 的 DIV 内容打印到打印机?
- javascript - 如何从 html 事件传递(或引用)“$(this)”?
- r - 如何将抽样权重纳入李克特量表调查问题的分析中?