我有一个列表视图,其中填充了正在运行的应用程序名称:
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;
}
我做错了什么?
答案 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 ++应该有帮助),你应该能够更好地了解哪些不适合你