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

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

C# と VB.NET の入門サイト

Re[3]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得


(過去ログ 45 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

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

分類:[Windows 全般] 

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

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

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

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

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

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

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

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

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

タイマーだと、タイマー周期の合間にトップレベルウィンドウが入れ替わる可能性があるので、フックの方が確実性は高いでしょうね。

引用返信 編集キー/
■23752 / inTopicNo.4)  Re[3]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ y4yama (78回)-(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は押さなくて)
これで事前に取れそうなのですが・・・

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

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

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

であれば、メニューをクリックした何秒か後に撮るので、それまでに目的のウィンドウをアクティブにしといてください、というツールはありますね。
引用返信 編集キー/
■23763 / inTopicNo.6)  Re[1]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ NyaRuRu (59回)-(2008/08/21(Thu) 17:33:42)
No23740 (まどか さん) に返信
> NotifyIconのメニュー内でデスクトップの最前面ウィンドウ(タスクトレイをクリックする前の作業ウィンドウ)を取得しようとしてます。

最前面のウィンドウとフォアグラウンドウィンドウは別の概念です.
念のため.
引用返信 編集キー/
■23785 / inTopicNo.7)  Re[2]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ まどか (581回)-(2008/08/21(Thu) 22:44:16)
えぇ、急きょ半ドンになったので帰っちゃいました。(汗

> れいさん、ひどりさん

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

> y4yama さん

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

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

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

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

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


最初に書きましたが、連鎖反応で急きょ明日はおやすみとなりましたのでお試しは月曜以降ということでご容赦ください。
#それまではきっとシャノンさんが。。。
引用返信 編集キー/
■23987 / inTopicNo.8)  Re[3]: タスクトレイメニューでデスクトップの最前面ウィンドウを取得
□投稿者/ まどか (584回)-(2008/08/26(Tue) 10:52:40)
アクティブになる直前というメッセージがあれば、Shell_TrayWndウィンドウのウィンドウプロシージャでフックすればと思いましたがだめ。
というようにいろいろ試しましたが、苦労の割にはというところが無きにしも非ず。。。
ホットキーにより要件は満たしていますのでこれで終わりにします。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -