5

次のコードを使用して、単一のモニターに描画しています。

Point cursorLocation;
NativeMethods.GetCursorPos(out cursorLocation);
Screen screen = Screen.FromPoint(cursorLocation);

Point h1 = new Point(screen.Bounds.Left, cursorLocation.Y);
Point h2 = new Point(screen.Bounds.Right, cursorLocation.Y);
Point v1 = new Point(cursorLocation.X, screen.Bounds.Top);
Point v2 = new Point(cursorLocation.X, screen.Bounds.Bottom);

using (Graphics graphics = Graphics.FromHwnd(NativeMethods.GetDesktopWindow())) {
    NativeMethods.SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
    graphics.DrawLine(Pens.Red, h1, h2);
    graphics.DrawLine(Pens.Red, v1, v2);
}

本来、これ 理論的にはどちらのモニターでも描画する必要があります。ただし、プライマリのみを使用します。したがって、これを修正するために、すべてのディスプレイの DC を取得し、この方法で実行しようとしています。

IntPtr hdc = NativeMethods.CreateDC("DISPLAY", IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
Graphics graphics = Graphics.FromHdc(hdc);
graphics.DrawLine(Pens.Red, h1, h2);
graphics.DrawLine(Pens.Red, v1, v2);
graphics.Dispose();
NativeMethods.ReleaseDC(IntPtr.Zero, hdc);

考えてみてください、これは画面にまったく描画されません。CreateDC のさまざまなオーバーロードを試し、SO やその他のリソースを検索しましたが、困惑しました。


これが解決されたら、SHCHangeNotify を使用してデスクトップを更新することでちらつきをなくす方法を知っている人はいますか? 私は2本の線を描いているだけで、狂ったようにちらつきます..)

4

4 に答える 4

4

これは私のために働いた。名前を取得するために EnumDisplayDevices を使用しました。

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

var hdc = CreateDC(@"\\.\DISPLAY1", "", "", IntPtr.Zero);
Graphics g = Graphics.FromHdc(hdc);
var pt = Cursor.Position;
g.DrawEllipse(Pens.BlueViolet, pt.X - 100, pt.Y - 100, 200, 200);

詳細はこちら: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145179(v=vs.85).aspx

于 2013-03-30T03:13:23.867 に答える
3

これはあなたの質問に対する回答ではありませんが、問題がなければ、WPF を使用してこれを解決することをお勧めします。私は透過性などの他の種類のデスクトップ操作を試しましたが、WPF は GDI の代替手段と比較して非常に高速です。

wpf アプリケーションを配置し、ペイントする必要があるすべての領域に合わせてサイズを変更します。次に、透明に設定し、クリックスルーを確認します(100%の透明度がデフォルトだと思います)。そうすれば、この大きな WPF キャンバス/フォームに何もない限り、すべてのマウス イベントがデスクトップにクリックスルーされます。

次に、その上にペイントを開始します。(線や画像に効果を加えるのがとても簡単だったので気に入りました)。ちらつきがないことを保証します。

代わりに、通常の Windows フォームで同じスキームを使用することもできます。

これにより、作業を行うために GDI に頼る必要がなくなります。

あなたが今それに近づいているので、このちらつきのないことを行うことができる唯一の方法は、デスクトップ WM_PAINT のウィンドウ メッセージングにフックし、そこで作業を行うことだと思います。

于 2009-03-30T08:59:40.877 に答える
1

残念ながら、次の理由により、どちらの回答も役に立ちません。

これは WF 用に構築された基本フレームワークであるため、Windows フォームに限定されます。TransparencyKey/Form トリックを試しましたが、まだちらつきが多すぎます。

私はほぼ 10 種類の方法を真剣に試しましたが、Google で DirectX/Direct3D、C# デスクトップ フックなどを検索した結果でさえ、役に立ちませんでした。

私がやろうとしているのは、デスクトップ全体に1px x 1pxの十字線を描くことだけです..確かに、ちらつきや良好なパフォーマンスなしでこれを行う方法の例を誰かが持っている必要があります:? D3D、DX、GDI、またはその他? :\

于 2009-03-31T02:06:35.217 に答える