有没有办法在最小化进程时也从进程中获取屏幕截图?
Posted
技术标签:
【中文标题】有没有办法在最小化进程时也从进程中获取屏幕截图?【英文标题】:Is there any way to get a screenshots also from processes when they are mininimized? 【发布时间】:2015-09-23 01:41:21 【问题描述】:今天我可以得到应用程序最小化窗口的截图。 例如,如果我打开画图,即使画图已最小化,我也会看到画图主窗口的屏幕截图。
这是获取 WindowsSnap 的类,它的代码有点长,所以我将它添加到 pastebin.com WindowSnap.cs
并且类WindowSnapCollection也添加到pastebin.com WindowSnapCollection.cs
在 form1 顶部和构造函数中,我正在做: 变量:
private Graphics g;
private Image img;
private Image imgClone;
然后在构造函数中:
img = new Bitmap(pictureBoxSnap.Width, pictureBoxSnap.Height);
imgClone = new Bitmap(pictureBoxSnap.Width, pictureBoxSnap.Height);
Graphics g;
using (g = Graphics.FromImage(img))
g.Clear(Color.White);
pictureBoxSnap.Image = img;
this.listBoxSnap.Items.AddRange(WindowSnap.GetAllWindows(true, true).ToArray());
for (int i = listBoxSnap.Items.Count - 1; i >= 0; i--)
string tt = listBoxSnap.Items[i].ToString();
if (tt.Contains(" ,"))
listBoxSnap.Items.RemoveAt(i);
buttonSnap.Enabled = true;
string[] myList = new string[listBoxSnap.Items.Count];
for (int i = 0; i < listBoxSnap.Items.Count; i++)
string tt = listBoxSnap.Items[i].ToString();
int index = tt.LastIndexOf(",");
myList[i] = tt.Substring(0, index);
最后,我得到一个打开的应用程序窗口屏幕截图最小化应用程序的列表
我现在有 65 个进程正在运行我想知道我的问题是我是否还能以某种方式获得最小化进程的屏幕截图?而不是所有的应用程序。
【问题讨论】:
这是显示我的程序运行时的屏幕截图。现在我可以获得所有最小化的应用程序窗口截图。但我想知道是否以及如何获取所有进程,例如我现在有 65 个正在运行的进程,以便获取这 65 个进程或至少具有图形界面的进程的屏幕截图。 postimg.org/image/r1hz40v8d 您能否使用Process.GetProcesses();
枚举进程并仅列出那些具有非零主窗口句柄的进程,例如p.MainWindowHandle != IntPtr.Zero
?
讨厌是的,我得到了 24 个 intptrs
【参考方案1】:
遍历进程,并为每个有效的 hWnd 调用 API 函数 IsIconic
。例如:
foreach (Process p in Process.GetProcesses())
if (p.MainWindowHandle != IntPtr.Zero)
if (IsIconic(p.MainWindowHandle))
System.Diagnostics.Debug.Print("Window: 0 Is minimized", p.MainWindowTitle);
IsIconic
由以下 p/Invoke 签名定义。
[DllImport("User32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsIconic(IntPtr hWnd);
【讨论】:
以上是关于有没有办法在最小化进程时也从进程中获取屏幕截图?的主要内容,如果未能解决你的问题,请参考以下文章