2

.NET (WinForms、GTK#、...) で利用可能なライブラリを使用して、自分が所有していないネイティブの Windows フォームにオーバーレイをレンダリングする良い方法を探しています。正確には、ウィンドウの特定の場所にいくつかのラベルまたはテキスト ボックスを表示したいと考えています。

デバイス コンテキストと System.Drawing:私が現在行っているのは、他のアプリケーションの一部が予期しない間隔で再描画されるため、ちらつきの原因となる他のウィンドウのデバイス コンテキストに直接描画することです。したがって、フック マジックを使用してその WM_PAINT イベントをキャッチする必要がありますが、より簡単な方法がない限り、実際にはそれほど遠くまでは行きません。

子ラベルが表示された透明なウィンドウ オーバーレイ:私が試した別の手法は、他のウィンドウのサイズで Windows.Forms.Form を作成し、TransparencyKey を使用して子のみを表示することでした。ウィンドウを一番上のものにしたくないので、これを正しくするのはかなり難しいようですが、外部ウィンドウのちょうど1 つのZ レベルだけです。利点は、クリックイベントなどを実際に処理できるため、より多くの動作を追加できることです。

上記の2つの手法の問題をどのように実装/処理しますか?

4

3 に答える 3

2

実装がより簡単になるはずなので、間違いなく透明なウィンドウアプローチを使用してください。透明なフォームの作成は非常に簡単です。TransparenyKey を使用して背景を描画しないようにする方法は既にご存じでしょう。また、ウィンドウから境界線を削除し、最小/最大/閉じるボタンを削除して、クロムが表示されないようにします。

目的のウィンドウが所有するウィンドウを作成すると、常にターゲットの上に表示され、モードレス ダイアログのように動作します。つまり、所有しているウィンドウが表示されている場合にのみ表示されます。

于 2009-01-12T02:51:09.943 に答える
0

ご回答ありがとうございます。まだ少し混乱しています。ウィンドウの所有者を、自分のアプリケーションが所有していないものにどのように設定しますか? 他のアプリケーションが管理されていない場合でも、それは不可能だと思いますよね?

編集:

これで少し近づきました。サンプル コードは Boo にあります。

[DllImport("user32.dll", SetLastError: true, CharSet: CharSet.Auto)]
public def SetParent(child as IntPtr, parent as IntPtr):
    pass

def createAttachedForm(parentHandle as IntPtr):
  f = Form()
  f.Text = "My overlay"
  f.Show()
  SetParent(f.Handle, parentHandle)
  Application.Run(f)

現在、TransparencyKey だけが機能していないようです。代わりに、値が設定されると、フォームは完全に非表示になります。

于 2009-01-12T07:54:43.780 に答える