3

C# を使用して、すべての上に (マウスで) 線を引く必要があります。P/Invoke を使用して、デスクトップ ウィンドウの Graphics オブジェクトを取得できます。

DesktopGraphics = Graphics.FromHdc(GetDC(IntPtr.Zero));

ただし、このグラフィックス オブジェクトを使用して描画したものはすべて、左側のモニターにのみ表示され、右側のモニターには何も表示されません。失敗でも何でもなく、表示されないだけです。

Graphics オブジェクトを作成すると、可視クリップ領域が 1680 x 1050 であることが示されます。これは、左のモニターの解像度です。左モニターのデバイスコンテキストのみを取得しているとしか思えません。両方 (または任意の数) のモニターのデバイス コンテキストを取得する方法はありますか?


EDIT 3/7/2009: 私が使用した修正に関する追加情報。

colthium が提供する修正プログラムを使用して、各モニターのグラフィック オブジェクトを作成するための次のコードと、グローバル マウス ポイントをグラフィック サーフェス上の有効なポイントに変換できるようにオフセットを格納する方法を考え出しました。

private void InitializeGraphics()
{
    // Create graphics for each display using compatibility mode
    CompatibilitySurfaces = Screen.AllScreens.Select(s => new CompatibilitySurface()
        {
            SurfaceGraphics = Graphics.FromHdc(CreateDC(null, s.DeviceName, null, IntPtr.Zero)),
            Offset = new Size(s.Bounds.Location)
        }).ToArray();
}

private class CompatibilitySurface : IDisposable
{
    public Graphics SurfaceGraphics = null;
    public Size Offset = default(Size);

    public PointF[] OffsetPoints(PointF[] Points)
    {
        return Points.Select(p => PointF.Subtract(p, Offset)).ToArray();
    }

    public void Dispose()
    {
        if (SurfaceGraphics != null)
            SurfaceGraphics.Dispose();
    }
}

[DllImport("gdi32.dll")]
static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);
4

2 に答える 2

2

これは、同じ問題を抱えていた別の人へのリンクです。次の呼び出しで解決されました。

CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)

これにより、すべてのモニターに DC が返されます。

于 2009-02-23T04:25:08.817 に答える
0

EnumDisplayMonitor を取得するための URL に従って、問題が解決する場合があります

MSDN

すべてのディスプレイ モニターに関する情報を取得するには、次のようなコードを使用します。

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0); MSJ でもう1 つの URL を提供

于 2009-02-23T04:07:55.520 に答える