1

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

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;
        }

我究竟做错了什么?

4

1 回答 1

2

如果您描述它的哪些部分不起作用,这将有所帮助。

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

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

然后使用 Member 变量作为句柄,而不是该进程的窗口句柄 GetWindowRect(Handle, out bonding);

您需要调用才能从进程中获取窗口句柄。另外,一个进程不可能有多个窗口吗?您不需要使用 EnumWindows 和 GetWindowThreadProcessID() 的组合遍历指定进程的所有窗口(如何从进程 ID 获取主窗口句柄?

一旦你发现你得到了正确的进程窗口句柄(spy++ 应该在这方面有所帮助),你应该能够更好地了解什么不适合你

于 2012-07-09T19:28:55.400 回答