2009-03-30 27 views
4

私は、単一のモニタ上に描画するには、次のコードを使用しています:複数のモニタ上のすべてのウィンドウの上に描画

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つの線を描くだけで、それは狂ったようにちらつきます。)

答えて

3

これはあなたの質問に対する回答ではありませんが、問題がなければ、これを解決するためにWPFを使って試してみましょう。私は透過性のような他の種類のデスクトップのやりとりで遊んだことがあり、WPFはGDIの代替案に比べて高速です。

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

それから、塗装を開始してください。 (私はそれがラインと画像にエフェクトを追加するのは非常に簡単だったので気に入った)。ちらつきがないことを保証します。

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

この方法では、あなたの仕事をするためにGDIに向ける必要はありません。

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

-1

最初の部分は助けられません。私はPaintイベントで線を描画していると仮定します。ダブルバッファリングを使用してフリッカーを取り除く。

1

残念ながらどちらも答えは次の理由により、任意のヘルプは次のとおりです。

これはWFのために構築されたベースのフレームワークであるように私は、Windowsフォームに制限しています。 私はTransparencyKey/Formトリックを試みましたが、あまりにもちらつきがあります。

私は真剣に約10種類の方法を試しました。さらに、GoogleのDirectX/Direct3D、C#Desktop Hooksなどの検索結果でさえ私を役に立たせてくれませんでした。

私がしようとしているのは、デスクトップ全体(1px x 1px)に跨った十字線を描くことです。確かに、誰かがちらつきや良いパフォーマンスなしでこれを行う方法の例をいくつか持っているに違いありません: D3D、DX、GDIなど? :\

0

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

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

var hdc = CreateDC(@"\\.\DISPLAY1", "", "", IntPtr.Zero); 
Graphics graphics = 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

+0

あなたのコードはそのままでコンパイルされません - あなたのグラフィックオブジェクトは、「グラフィック」という名前が、後で、あなたは「グラム」として使用されます。 – BrainSlugs83

+0

Graphics.FromHwnd(hdc)は、 "\\。DISPLAY1"から作成されたhdcと、EnumDisplayDevicesによって返された文字列によって作成された非ゼロのdcsのすべてについて、私のためにOutOfMemoryExceptionをスローします。 – BrainSlugs83

関連する問題