1

私は、プログラムがモニターのスクリーンショットを撮る必要があり、ユーザーが結果のビットマップを操作できるようにするアプリケーションに取り組んでいます。Graphics.CopyFromScreen接続されている任意のモニターでこのタスクを実行するコードを ( を使用して) 作成しました。ただし、私は 2 台のモニターで作業しています。これにより、興味深いアプリケーションを一方のモニターで開き、ソフトウェアをもう一方のモニターで開くことができます。1 つのモニター環境では、スクリーンショットのコードが行うことは、プログラムの写真を撮ることだけです (画面上で必ず最大化されます)。

アプリケーションの下の領域のスクリーンショットを撮る方法はありますか? これはデスクトップかもしれませんが、アプリケーションが実行されていない場合は、アクティブなウィンドウの配置になる可能性が高くなります。理論的には、アプリケーションを最小化し、表示されているもののスクリーンショットを撮り、次にアプリケーションの最小化を解除することは機能しますが、ユーザーがソフトウェアを操作している間にこれらのスクリーンショットを頻繁かつ非同期に撮ることを除いて、そうする必要があります。アプリケーションが最小化または中断されたことをユーザーが意識することなくシームレスに実行されます。

スクリーンショットを撮るための私のコードは以下のとおりです (他のコードから引っ張ってきたので、混乱を許してください)。

public Bitmap getScreenshot()
    {
        Rectangle rc = Screen.AllScreens[0].WorkingArea; // the OTHER monitor
        Rectangle rcClient = this.ClientRectangle;

        Bitmap memoryImage = null;

        try
        {
            int borderSizeH = 0, borderSizeW = 0;

            memoryImage = new Bitmap(rc.Width - 2 * borderSizeW, rc.Height - 2 * borderSizeH, PixelFormat.Format32bppArgb);

            Size rc2 = new Size(rc.Width, rc.Height);
            using (Graphics memoryGrahics = Graphics.FromImage(memoryImage))
            {
                memoryGrahics.CopyFromScreen(rc.Location.X + borderSizeW, rc.Location.Y + borderSizeH, 0, 0, rc2, CopyPixelOperation.SourceCopy);

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Capture failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

       return memoryImage;
    }
4

0 に答える 0