C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.23740 の関連記事表示

<< 0 >>
■23740  タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ まどか -(2008/08/21(Thu) 11:44:02)

    分類:[Windows 全般] 

    NotifyIconのメニュー内でデスクトップの最前面ウィンドウ(タスクトレイをクリックする前の作業ウィンドウ)を取得しようとしてます。
    NotifyIcon.MouseDownでGetForegroundWindowを呼び出すと、タスクバー(Shell_TrayWnd)が返ってくるようです。
    コンテキストメニュー.ClickではFrameworkのウィンドウクラスが返ってくるようです。

    特定のウィンドウスタイルを持つZオーダーのトップウィンドウを探すというようなやり方になると思うのですが。。。
    ウィンドウ操作では無理ならタスクトレイのアイコンがアクティブになる直前をフックしてGetForegroundWindowするってことになりますでしょうか。
    もう一歩踏み込んだヒントをお願いします。
親記事 /過去ログ45より / 関連記事表示
削除チェック/

■23744  Re[1]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ れい -(2008/08/21(Thu) 13:03:51)
    No23740 (まどか さん) に返信
    > NotifyIconのメニュー内でデスクトップの最前面ウィンドウ(タスクトレイをクリックする前の作業ウィンドウ)を取得しようとしてます。
    > NotifyIcon.MouseDownでGetForegroundWindowを呼び出すと、タスクバー(Shell_TrayWnd)が返ってくるようです。
    > コンテキストメニュー.ClickではFrameworkのウィンドウクラスが返ってくるようです。
    >
    > 特定のウィンドウスタイルを持つZオーダーのトップウィンドウを探すというようなやり方になると思うのですが。。。

    「GetNextWindow」で列挙しつつ「WS_OVERLAPPED」を探すというのでどうでしょう?

    > ウィンドウ操作では無理ならタスクトレイのアイコンがアクティブになる直前をフックしてGetForegroundWindowするってことになりますでしょうか。

    タイマーかけて定期的にトップレベルウィンドウを取得しておくとか。
記事No.23740 のレス /過去ログ45より / 関連記事表示
削除チェック/

■23748  Re[2]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ 渋木宏明(ひどり) -(2008/08/21(Thu) 14:23:16)
>
    > 「GetNextWindow」で列挙しつつ「WS_OVERLAPPED」を探すというのでどうでしょう?

    かつ、WS_VISIBLE とか、他にもいくつか条件づけが必要かも。
    でも、それでも誤検出可能性は否めないかな。

    > タイマーかけて定期的にトップレベルウィンドウを取得しておくとか。

    タイマーだと、タイマー周期の合間にトップレベルウィンドウが入れ替わる可能性があるので、フックの方が確実性は高いでしょうね。
記事No.23740 のレス /過去ログ45より / 関連記事表示
削除チェック/

■23752  Re[3]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ y4yama -(2008/08/21(Thu) 15:44:54)
    こんにちは。興味を持って試してみました
    VB2008で
    Private Sub NotifyIcon1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseMove
            Dim targetWindowHandle As IntPtr = GetForegroundWindow()
            Console.WriteLine("H=" & targetWindowHandle.ToString)
        End Sub
    
    としたら、異なるアクティブなウィンドウ毎に異なるHandleが返ってきました。(Mouseは押さなくて)
    これで事前に取れそうなのですが・・・
記事No.23740 のレス /過去ログ45より / 関連記事表示
削除チェック/

■23756  Re[1]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ シャノン -(2008/08/21(Thu) 16:12:22)
    No23740 (まどか さん) に返信
    > もう一歩踏み込んだヒントをお願いします。

    もう一歩踏み込んだ状況説明があるとやりやすいです。

    例えば、推測ですが「タスクトレイアイコンからの操作で、アクティブなウィンドウのスクリーンショットを撮るツールを作ろうとしています」とかですね。
    # いや、ちょうどそういうのを作ろうとしていたもので。
    # GetForegroundWindow がタスクバーを返すというのはいい事を聞きました。

    であれば、メニューをクリックした何秒か後に撮るので、それまでに目的のウィンドウをアクティブにしといてください、というツールはありますね。
記事No.23740 のレス /過去ログ45より / 関連記事表示
削除チェック/

■23763  Re[1]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ NyaRuRu -(2008/08/21(Thu) 17:33:42)
    No23740 (まどか さん) に返信
    > NotifyIconのメニュー内でデスクトップの最前面ウィンドウ(タスクトレイをクリックする前の作業ウィンドウ)を取得しようとしてます。

    最前面のウィンドウとフォアグラウンドウィンドウは別の概念です.
    念のため.
記事No.23740 のレス /過去ログ45より / 関連記事表示
削除チェック/

■23785  Re[2]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ まどか -(2008/08/21(Thu) 22:44:16)
    えぇ、急きょ半ドンになったので帰っちゃいました。(汗

    > れいさん、ひどりさん

    タイマ監視まで飛び出しているので一発OKみたいなのは無いみたいですね。
    確実に取得できるタイミングを見つけたほうがよさそうです。

    > y4yama さん

    MouseMoveですか。よし!
    が、タスクバーの他の部分をクリックした後だとだめかも?ですね。>試してみます。

    > シャノンさん
    > 推測ですが「タスクトレイアイコンからの操作で、アクティブなウィンドウのスクリーンショットを撮るツールを作ろうとしています」とかですね。

    なんだ、知ってんじゃないの。(笑
    もともとVB6のころに作ったものを今まで新言語に移行し続けてきました。
    キャプチャ機能そのものはできあがってます。
    ホットキーで通常時にアクティブウィンドウのキャプチャはできていまして、タスクトレイメニューにデスクトップに対するメニューを作りました。
    当然GetDesktopWindow一発なので問題はありませんで、じゃぁメニュー選択時のアクティブウィンドウに対するメニューもということでの質問でした。
    ホットキーでできてますのでいらないと言っちゃいらないわけですが。。。一応方法は知っておこうと。

    > NyaRuRuさん
    > 最前面のウィンドウとフォアグラウンドウィンドウは別の概念です.

    なるほど、TopMostとFocusedWindowですね。
    すっかり忘れてましたが、これはアプリの仕様として決める必要がありますね。>アクティブとは
    かつ、重なっていた時の処理も出てきそうです。。。


    最初に書きましたが、連鎖反応で急きょ明日はおやすみとなりましたのでお試しは月曜以降ということでご容赦ください。
    #それまではきっとシャノンさんが。。。
記事No.23740 のレス /過去ログ45より / 関連記事表示
削除チェック/

■23987  Re[3]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ まどか -(2008/08/26(Tue) 10:52:40)
    アクティブになる直前というメッセージがあれば、Shell_TrayWndウィンドウのウィンドウプロシージャでフックすればと思いましたがだめ。
    というようにいろいろ試しましたが、苦労の割にはというところが無きにしも非ず。。。
    ホットキーにより要件は満たしていますのでこれで終わりにします。

    ありがとうございました。
記事No.23740 のレス / END /過去ログ45より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -