デスクトップ上の描画ラインは勝利7で非常に遅い

このコードを使用して、マウスですべてのウィンドウの上に線を描画します。私はマウスのフックを使ってマウスの座標を取得しています。右マウスボタンが押されている間は、マウスの動きごとに線を描いています。私は NOTXORPEN を使用していますので、再度描画するだけで行を削除することができます。

その中に:

ScreenDC := GetDcEx(GetDesktopWindow,0,DCX_LOCKWINDOWUPDATE);

PenHandle := CreatePen(PS_SOLID,HitStorage.GetPenWidth,10);

SelectObject(ScreenDC ,PenHandle);
OldPenMode := SetRop2(ScreenDC, R2_NOTXORPEN); //Setting the PenMode to NotXor

MoveToEx(ScreenDC, X, Y, Nil); //Move The Pen Position to the Cursor Position

私はこのコードをマウスの動きごとに使用しています:

LineTo(ScreenDC, X, Y);//Draw a Line between the prev Point to Current Point

このコードはWindows 95,98,2000、XPで動作しましたが、Windows 7では非常に遅いです。

私は、Delphi 3でマウスジェスチャープログラム(1999年に書かれた)をWindows API(マウスフックはバージョン3のDelphi BUGのためにVCで書かれています)を使って書いています。このプログラムは、 StrokeIt がやっていることを正確に行っていますが、何とかStrokeItがこの問題の解決策を見つけ出しました。

私のコードはDelphiにありますが、どの言語でも答えが分かります!

私は正確に何を構築しようとしているのかをより詳細に説明します。私のアプリケーションは3つの部分に分かれています:

  1. 右マウスボタンがクリックされている間のマウスジェスチャーの追跡と保存
  2. 限られた数の図形に基づくジェスチャ認識
  3. 認識されたジェスチャーとジェスチャーの開始時にカーソルの下にあったアプリケーションに基づくマクロのアクティブ化

私はPart1をWindows7(Vista)で動かすのに問題があります。そして、Martynが答えて書きましたように、私はコンセプトを変えなければならないと思います。今では、マウスメッセージとジェスチャー描画を上記のコードに引っ掛けて追跡しています...階層化されたウィンドウの基本を理解しましたが、私にとってはうまくいくでしょうか?あなたはフルスクリーンの一番透明なウィンドウを作ってそれを描くと思うのですか?私はこれのためのコードを書くのを助けることができますか?

5
これはDWMによるものです。
追加された 著者 SLaks,

1 答え

Windows Vistaが登場する前は、デスクトップは実際のGDIサーフェスとして描かれていたので、この種のアクティビティはうまくいきましたが、GDIドライバのアクセラレーションに依存していました。

Vista以上では、デスクトップウィンドウマネージャはDXを使用して、複数のウィンドウ(いくつかはGDIを使用する可能性がありますが、その一部は使用できない場合があります)を新しいドライバーモデルにレンダリングされる単一の最終シーンに合成します。その結果、画面のピクセルを直接突き刺すのがずっと遅くなります。

もっと根本的に、これは物事を終わらせる方法ではありません。ビルドしようとしていることは私には分かりませんが、階層化されたWindowsについて知りたいと思うかもしれません。 http ://msdn.microsoft.com/en-us/library/ms997507.aspx で、実際のアプリケーションの上に複雑なシーンを作成するためのサポートされた適切な方法を提供します。また、マウスフックの使用を避けるのにも役立ちます。これはまた悪い考えです。

マーティン

10
追加された
次のステップは、いくつかの階層化されたWindowサンプルコードをダウンロードし、実際にどのように動作するかを理解することです。私はコードを書く時間がありません、ごめんなさい。
追加された 著者 Martyn Lovell,
私は私の質問にいくつかの説明を追加しました。あなたはそれを見直すことができますか?
追加された 著者 Shlantz,