DOBON.NET DOBON.NETプログラミング掲示板過去ログ

別アプリからフォーカスを受け取ったときの判断

環境/言語:[vb.net]
分類:[.NET]

いつもお世話になっております。

わからないことがあるのでご教授願います。

自作アプリ「A」と別アプリ「B」あります。
「B」がアクティブな状態から、
「A」をアクティブにした場合、
「A」側で、
「B」のアプリ名称を取りたいと思っていますが、うまくいきません。

WndProcをオーバーライドし、wm_ACTIVATEAPP等で試行錯誤していますが、
解決にいたっていません。
上記の方法で「A」から「B」に移る際の「B」のアプリ名称は取得できましが、
「B」から「A」に移ってきた際の「B」のアプリ名称は取得できませんでした。

よろしくお願いします。
> 自作アプリ「A」と別アプリ「B」あります。
> 「B」がアクティブな状態から、
> 「A」をアクティブにした場合、
> 「A」側で、
> 「B」のアプリ名称を取りたいと思っていますが、うまくいきません。

  A側のWndProcで、WM_ACTIVATEAPP受信した際のm.LParamに
  Bのタスクハンドル入っていないと言うことですか?
  その逆が正常に動作している・・・おかしいですよね?

  そのコード掲載してもらえますか。

以上。
オショウ様
いつも返答ありがとうございます。

Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
If m.Msg = &H1C Then
Debug.WriteLine(m.Msg & ":" & m.HWnd.ToString() & ":" &    m.WParam.ToString() & ":" & m.LParam.ToString())
End If
End Sub

とりあえず上記のコードで出力確認しているのですが、
WParamが1の場合は、LParamは0となっています。


LParamのタスクハンドルがよくわかってないのですが、名称は、
以下のように取得してます。
(タスクハンドルはl_procのMainWindowHandleじゃないのはなぜ?)
For Each l_proc As Process In Process.GetProcesses
If l_proc.MainWindowTitle <> "" Then
For Each sred As ProcessThread In l_proc.Threads
If sred.Id = id Then
Debug.WriteLine(id.ToString & ":" & l_proc.MainWindowTitle)
End If
Next
End If
Next


■No24681に返信(オショウさんの記事)
>>自作アプリ「A」と別アプリ「B」あります。
>>「B」がアクティブな状態から、
>>「A」をアクティブにした場合、
>>「A」側で、
>>「B」のアプリ名称を取りたいと思っていますが、うまくいきません。
>
>   A側のWndProcで、WM_ACTIVATEAPP受信した際のm.LParamに
>   Bのタスクハンドル入っていないと言うことですか?
>   その逆が正常に動作している・・・おかしいですよね?
>
>   そのコード掲載してもらえますか。
>
> 以上。
> とりあえず上記のコードで出力確認しているのですが、
> WParamが1の場合は、LParamは0となっています。

  その場合は、デスクトップからフォーカスもらった時ネ!
  (多分)

> (タスクハンドルはl_procのMainWindowHandleじゃないのはなぜ?)

  ウィンドウの無いプロセスの場合、どうするの?

※ あくまで仕様です・・・

以上。
オショウ様
返答ありがとう御座います。
デスクトップからフォーカスというのがいまいちわかりませんが、
タスクバーで、アプリの選択を切り替えたら、
WParamが1の場合もLParamに値が入っていました。
マウスでデスクトップに表示されているアプリをクリックする場合は、
「B」→「デスクトップ」→「A」
のような形になり、LParamが0になってしまうということですか・・・


■No24689に返信(オショウさんの記事)
>>とりあえず上記のコードで出力確認しているのですが、
>>WParamが1の場合は、LParamは0となっています。
>
>   その場合は、デスクトップからフォーカスもらった時ネ!
>   (多分)
>
>>(タスクハンドルはl_procのMainWindowHandleじゃないのはなぜ?)
>
>   ウィンドウの無いプロセスの場合、どうするの?
>
> ※ あくまで仕様です・・・
>
> 以上。
> デスクトップからフォーカスというのがいまいちわかりませんが、

  解らないと(原理を知らないと)組めませんよ・・・

> タスクバーで、アプリの選択を切り替えたら、
> WParamが1の場合もLParamに値が入っていました。
> マウスでデスクトップに表示されているアプリをクリックする場合は、
> 「B」→「デスクトップ」→「A」
> のような形になり、LParamが0になってしまうということですか・・・

  どのような操作でどのようなWindowメッセージが、どのような順番で
  流れてくるか・・・

  順番が変わっても、正常に動作するように組まないことには・・・

  調べるには、SPY++使って、Windowsメッセージの種類・順番をロギング
  してみて下さい。

※ Windowsメッセージはいつも同じ順番で流れてくるとは限らない場合が
  ある。と言うことです。
 (そこが厄介でありプログラマーの腕のみせどころだと思いますが)

以上。
オショウ様
返答ありがとうございます。

なんだか奥が深そうですね。

紹介していただいたSPY++というのを調べてみようと思います。

一応、
「A]のアプリでタイマーを使用し、
GetForegroundWindowでBの情報を保持しておくという方法で、
実現はできたので解決とさせていただきます。
(いい悪いは別としてあくまで実現できたということで・・・)

ありがとうございました。

■No24707に返信(オショウさんの記事)
>>デスクトップからフォーカスというのがいまいちわかりませんが、
>
>   解らないと(原理を知らないと)組めませんよ・・・
>
>>タスクバーで、アプリの選択を切り替えたら、
>>WParamが1の場合もLParamに値が入っていました。
>>マウスでデスクトップに表示されているアプリをクリックする場合は、
>>「B」→「デスクトップ」→「A」
>>のような形になり、LParamが0になってしまうということですか・・・
>
>   どのような操作でどのようなWindowメッセージが、どのような順番で
>   流れてくるか・・・
>
>   順番が変わっても、正常に動作するように組まないことには・・・
>
>   調べるには、SPY++使って、Windowsメッセージの種類・順番をロギング
>   してみて下さい。
>
> ※ Windowsメッセージはいつも同じ順番で流れてくるとは限らない場合が
>   ある。と言うことです。
>  (そこが厄介でありプログラマーの腕のみせどころだと思いますが)
>
> 以上。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板