2010-12-03 7 views
2

私は(インプロセス)プラグインをアプリケーションに開発しています。プラグインの一部として、アプリケーションのツールチップを自分で置き換えたいと思っています。しかし、私が利用できるAPIはありませんので、私は低レベルに進むことに決めました。ウィンドウが表示される前にインターセプトして隠す

私はツールチップのウィンドウクラスを知っていますが、質問はどのように作成されているのか、後でどのように閉じるのですか?ここで

は、私がこれまでに行うことを考えたものです:

  1. がキャッチすると、クラスを確認し、WM_CREATEターゲット
  2. のプロセスは、それが実際にあることを確認しWM_CREATE
  3. 上のシステム全体のフックを作成します。ウィンドウ私が気に:プロセスが私のプラグインが
  4. に座っているものであれば
    • とクラスが正しい型である場合
    • 、正しいアプリケーションにフォーカスがある場合
  5. ではなく

はどのように聞こえるん作成したウィンドウへWM_DESTROYを送信し、その位置に自分自身のウィンドウを作成します(複数のアプリケーションの場合)?ツールチップを処理するためのAPIが実際にはないと仮定すると、必要なものに簡単な方法がありますか?

ありがとうございます!

私はこれらの2つの言語でそれを書くことを意図したとおり、C++/C#などのタグP.S(C++システムワイドフックのため、他のすべてのためのC#)

+1

ツールチップは、多くの場合、*作成し、ちょうど保つことによって行われますトップレベルの親ウィンドウごとに1つ*のツールチップウィンドウ。そのツールヒントウィンドウは、必要に応じて調整および表示され、必要でない場合は非表示になります。だから、ウィンドウがいつ表示されたのかを追跡する必要があります。作成されたときではなく、明らかにウィンドウを表示しないようにする必要があります(隠してしまう可能性があります)。 –

+0

@Leo:コメントありがとう。それはおそらく非常に真実です。 – VitalyB

答えて

2

ブロックしたいウィンドウのタイプがわかっている場合は、それをサブクラス化して破壊を処理することができます。WndProc。独自のWndProcを設定し、それがWM_CREATEにDestroyWindowを()を呼び出し、残りの古いWndProcを呼び出す持ってGCL_WNDPROCSetClassLongPtr()を使用して、ツールチップのクラスにGCL_WNDPROCGetClassLongPtr()を使用してください。..

+0

私は混乱しています... GetClassLongPtr()はHWNDを必要としました。ツールチップはまだ作成されていません。 GetClassLongPtr()/ SetClassLongPtr()を使用して、まだ存在しないウィンドウをサブクラス化することができますか? – VitalyB

+0

ええ、最初にダミーのツールヒントウィンドウを作成し、それを使用する必要があります。 – kichik

+0

@kichik:興味深い...そして、私がそれをするならば、そのクラスのウィンドウのすべての将来のインスタンスは、そのMessagePumpを使用するでしょうか? – VitalyB

0

これは動作しません。ツールチップを置き換えて、ウィンドウを破壊するように伝えることができると仮定して、アプリケーションのビューを検討してください。アプリがツールチップを閉じる必要があると判断したときはどうなりますか?それはあなたの新しいウィンドウのハンドルを持っていない、それはあなたが破壊した古いウィンドウのハンドルを持っています。物事が間違って行く時間。

これをスムーズに実行するには、プラグインシステムがツールチップの置き換えを明示的にサポートする必要があります。おそらく、プラグインフレームワークのオプションの部分は、RequestTooltip関数です。存在しないか、nullを返した場合、またはデフォルトのツールチップが使用されている場合はそれを返します。そうでない場合は、提供されているプラ​​グインが使用されます。

+0

最初の部分について。それは本当です、それはそれより複雑です - 私は自分自身のウィンドウを隠すためにマウスを追跡する必要があります。元のアプリケーションは私のためにツールチップを隠すことはできませんが、なぜそれが問題を引き起こすべきかはわかりません。たとえば、「古い」ツールチップを破棄する際に問題がある場合は、代わりに隠すようにしても問題ありません(実際には、新しいツールチップを隠すために古いツールチップを破棄することもできます)。 – VitalyB

+0

2番目の問題について:私はアプリケーションがツールチップの存在について問い合わせるAPIを持たないので恐れているので、私は単純にできません= \ – VitalyB

関連する問題