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 ループで 1 つの変数 (selectedProgram) を上書きしているだけです。

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

次に、そのプロセスのウィンドウ GetWindowRect(Handle, out bond) のハンドルではなく、メンバー変数をハンドルとして使用します。

プロセスからウィンドウ ハンドルを取得するには、呼び出しが必要です。また、プロセスが複数のウィンドウを持つことはできませんか? EnumWindows と GetWindowThreadProcessID() の組み合わせを使用して、指定されたプロセスのすべてのウィンドウをループする必要はありませんか (プロセス ID からメイン ウィンドウ ハンドルを取得する方法は? )

プロセスの正しいウィンドウ ハンドルを取得していることがわかったら (spy++ が役立つはずです)、何が機能していないかをよりよく把握できるはずです。

于 2012-07-09T19:28:55.400 に答える