tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルSetForegroundWindowについて
記事No13644
投稿日: 2009/05/07(Thu) 18:42
投稿者5月病
お世話になります。

実行環境 
WinXP.sp3
VB6.0

SetForegroundWindow関数を用いてとあるフォームを最前面にしたいのですが、
どうにもうまくいきません。

フォーム_A上からフォーム_Aの最小化後にシェル関数を用いてEXE_Bを起動します。
(EXE_Bの起動中はWaitForSingleObjectを用いてEXE_Bの終了を待ちます。)
EXE_Bの終了後、フォーム_A上にてを自フォームを元サイズに戻し、
以下関数を呼び出しています。

Sub SetForegroundWin(hwnd As Long)
    'hwndはフォーム_Aのhwndです。
    Dim sp_time As Long
    Dim nForegroundID As Long
    Dim nTargetID As Long

    nForegroundID = GetWindowThreadProcessId GetForegroundWindow(), &H0

    nTargetID = App.ThreadID

    AttachThreadInput nTargetID, nForegroundID, True

    SystemParametersInfo SPI_GETFOREGROUNDLOCKTIMEOUT, 0, sp_time, 0

    SystemParametersInfo SPI_SETFOREGROUNDLOCKTIMEOUT, 0, ByVal 0&, 0

    SetForegroundWindow hwnd
    
    SystemParametersInfo SPI_SETFOREGROUNDLOCKTIMEOUT, 0, sp_time, 0
    
    AttachThreadInput nTargetID, nForegroundID, False

End Sub

上記コードの実行結果ですが、
EXE_B起動中にフォーム_A以外のウィンドウにフォーカスをあて、
EXE_Bを終了するとフォーム_Aがフォーカスをあてたウィンドウの裏に出てきます。

ご教授宜しくお願いします。

[ツリー表示へ]
タイトルRe: SetForegroundWindowについて
記事No13645
投稿日: 2009/05/07(Thu) 22:11
投稿者オショウ
> SetForegroundWindow関数を用いてとあるフォームを最前面にしたいのですが、
> どうにもうまくいきません。

  確認していませんが・・・
  SetWindowPosにて行った記憶があります。

  そうでないと、正しくZオーダーのトップならなかったかと。

以上。参考まで

[ツリー表示へ]
タイトルRe: SetForegroundWindowについて
記事No13646
投稿日: 2009/05/08(Fri) 07:01
投稿者花ちゃん
> SetForegroundWindow関数を用いてとあるフォームを最前面にしたいのですが、
> どうにもうまくいきません。

ここの掲載サンプル及び情報ではだめだったのでしょうか?

[ツリー表示へ]
タイトルRe^2: SetForegroundWindowについて
記事No13647
投稿日: 2009/05/08(Fri) 11:48
投稿者5月病
オショウさん、花ちゃんさん、回答ありがとうございます。

オショウさんの
SetWindowPosにてどうにか実現が出来ました。
一旦HWND_TOPMOSTで最前面固定にして
直後HWND_NOTOPMOSTでキャンセル。
ただ、個人的にSetForegroundWindowにて実現可能かと思っていたので、
不可能と断定出来るまでチャレンジしてみます。

花ちゃんさん
実はこのサイトの情報をかなり利用させていただいていたのですが、
知識不足で有用に活かせていなかったと思います。

[ツリー表示へ]
タイトルRe^3: SetForegroundWindowについて
記事No13648
投稿日: 2009/05/08(Fri) 12:22
投稿者花ちゃん
> 知識不足で有用に活かせていなかったと思います。
特に知識はなくても検索して調べれば、サンプルが見つかったかと。
http://hanatyan.sakura.ne.jp/patio/read.cgi?no=194

> 一旦HWND_TOPMOSTで最前面固定にして
> 直後HWND_NOTOPMOSTでキャンセル。
上記のサンプルのように、BringWindowToTop API を使った方が便利かも。

[ツリー表示へ]
タイトルRe^4: SetForegroundWindowについて
記事No13649
投稿日: 2009/05/08(Fri) 14:49
投稿者5月病
花ちゃんさん
回答ありがとうございます。

すいません、調べが足りませんでした。
> 上記のサンプルのように、BringWindowToTop API を使った方が便利かも。
上記で無事解決いたしました。

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

[ツリー表示へ]