WinXPを使用。私がしなければならないこと (VB または C# の pref) は、別の (クローズド ソース) プログラムがいつトレイに通知バルーンを表示するかを検出し、詳細を把握することです。どんな助けでも大歓迎です。ありがとう
3 に答える
.net言語からこれを行うには、pinvokeを使用する必要があると思います。
現在使用しているシステム(Vista Business SP2)では、バルーンウィンドウには常にウィンドウクラス#32769(デスクトップウィンドウ用に予約済み)があり、ウィンドウスタイルビットTTS_BALLOONが設定されているようです。
次のように機能する可能性があります。一時的なバルーンを作成し、そのhWndを取得し、削除する前にGetParent()を呼び出すことにより、すべての通知バルーンの親ウィンドウを決定します。次に、この親hwndの子を定期的にポーリングして(EnumWindows()またはFindWindowEx()を使用)、必要なクラスとスタイルのウィンドウを探します。
これは私には非常に移植性が低く、さまざまなプラットフォームで多くのテストが必要になる可能性があります。
pinvoke.netとspy++が役立つ場合があります。
幸運を!
同様の状況で、Microsoft ツール Spy++ を使用してウィンドウ情報を取得し、pinvoke 呼び出しを使用しFindWindow
てウィンドウが存在することを検出しました。
通知バルーンを試したことはありませんが、ピンボーク呼び出しGetText
でコンテンツを取得できると思います。
これを実現するには、必ず Win API 呼び出しを使用する必要があります。これがあなたがやろうとしている唯一のことである場合は、C# または VB のプラットフォーム呼び出しを大量に実行する必要がないように、そのままの C または C++ を使用する方がよいでしょう。
andyjohnson は、すべての通知バルーンのウィンドウ クラスが #32769 であり、TTS_BALLOON
スタイル セットが設定されていることを確認したので、CBT フックを使用できます( Win32フックに慣れていない場合は、それらを読んでください)。ウィンドウが作成されるたびにコールバックを取得し、そのクラスのウィンドウとそのスタイルをチェックします。
ただし、2 回目以降のポップアップで新しいバルーン ウィンドウが作成されるのか、それとも同じバルーン ウィンドウが非表示になって再表示されるだけなのかはわかりません。この場合、メッセージを取得するためにCallWndProc フックWM_SHOWWINDOW
が必要になる場合があります。
編集:
前述のフックは .NET では実装できないことに注意してください。低レベルのキーボードおよびマウス フックを除き、グローバル システム フックはネイティブ (アンマネージ) DLL に実装する必要があります。Windows はこの DLL を他のプロセスに読み込みます。.NET CLR が読み込まれていないプロセスにマネージ DLL が読み込まれると、そのプロセスがクラッシュします。(CLR が読み込まれている場合でも、別のアドレスにある可能性があり、これもクラッシュの原因になります。)
したがって、ネイティブ (アンマネージ) DLL でフックを作成する必要があります。Michael Kennedy が Code Project で行ったように、ここからマネージ アプリケーションにインターフェイスすることは可能ですが、それを適切に行い、上記のフック タイプを処理するには、プロセス間通信を使用する必要があります。マイケル・ケネディは辞退しました。全体として、説明した目的のためには、ネイティブ コードですべてをビルドする方がおそらく簡単でしょう。