在C#中捕获另一个程序的客户区?

时间:2012-07-09 17:56:27

标签: c# winforms process screenshot visual-c#-express-2010

我有一个列表视图,其中填充了正在运行的应用程序名称:

listView1.Items.Add(proc.MainWindowTitle);

代码在foreach语句中。我试图使用此代码获取所选项目(程序名称)并获取该程序的客户端窗口的屏幕截图:

 public string selectedProgram;

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    public static extern bool GetWindowRect(IntPtr hwnd, out Rectangle lpRect);

    private void button2_Click(object sender, EventArgs e)
    {
        Process[] process = Process.GetProcesses();
        foreach (var p in process)
        {
            selectedProgram = listView1.SelectedItems.ToString();
        }

        Rectangle bonds = new Rectangle();
        GetWindowRect(Handle, out bonds);
        Bitmap bmp = new Bitmap(bonds.Width, bonds.Height);

        using (var gfx = Graphics.FromImage(bmp))
        {
            gfx.CopyFromScreen(bonds.Location, Point.Empty, bonds.Size);
            pictureBox1.Image = bmp;
            Form2 frm2 = new Form2(this);
            frm2.Show();
            frm2.pictureBox1.Image = pictureBox1.Image;
        }

我做错了什么?

1 个答案:

答案 0 :(得分:2)

如果你描述它的哪些部分不起作用会有所帮助。

我不确定这是否是您的问题,但我发现您只是在第一个for循环中覆盖一个变量(selectedProgram)

Process[] process = Process.GetProcesses();
foreach (var p in process)
{
    selectedProgram = listView1.SelectedItems.ToString();
}

然后使用Member变量作为句柄而不是该进程窗口的句柄     GetWindowRect(处理,结束债券);

您需要调用才能从进程中获取窗口句柄。此外,进程是否不可能有多个窗口?您是否需要使用EnumWindows和GetWindowThreadProcessID()(How to get main window handle from process id?

的组合来遍历指定进程的所有窗口

一旦你发现你正在为这个过程获得正确的窗口句柄(spy ++应该有帮助),你应该能够更好地了解哪些不适合你