Windowを1番手前にするには??

解決


あっぴ  2001-07-09 17:49:09  No: 74630  IP: [192.*.*.*]

BringWindowToTopを使用して、指定のWindowを1番手前に表示したいのですが、VBからソースで起動すると上手くいくんですが、実行ファイル(EXE)から起動すると上手くいきません。
関数自体は正常終了しているようなんですが…。
知っている方がいらしたら教えてください。
お願いします。

以下ソースです。
Private Sub Main()
    Dim ExePath As String
    Dim lRet As Long
    
    ExePath = "C:\WINNT\system32\calc.exe"
        
    lRet = FindWindow(vbNullString, "電卓")
    If lRet = 0 Then
        strWork = Shell(ExePath, vbNormalFocus)
    Else
        If BringWindowToTop(lRet) = 0 Then
            End
        End If
    End If
End Sub

編集 削除
Say  2001-07-09 19:19:32  No: 74631  IP: [192.*.*.*]

APIのSetWindowPosをつかいます。
ポピュラーなんで、あっちこっちのVBサイトにサンプルのってます。
たとえば、VBラボ
http://www.remus.dti.ne.jp/~y-mac/apiidx.html

編集 削除
たかみちえ  URL  2001-07-09 22:51:22  No: 74632  IP: [192.*.*.*]

めんどくさい場合はこちらをどうぞ、
menu.checkedとそのままつなげてもいいので、たぶんらく。
APIのSetWindowPosと
定数のSWP_SHOWWINDOWとSWP_NOMOVEとSWP_NOSIZEは、
APIびゅーあーなどで宣言してください。
あ、でもここのサンプルにもありましたよね。

Public Sub Toppos(hwnd As Long, Top As Boolean)
    If Top = True Then
        SetWindowPos hwnd, -1, 0, 0, 0, 0, SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
    Else
        SetWindowPos hwnd, -2, 0, 0, 0, 0, SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
    End If
End Sub

  ところで、ものによっては、ほかの前面表示を無視して、何よりも前に出る"強力最前面表示"がありますけど、
あれってどうするんでしょうかねぇ?

  えーっと、たとえばスクリーンセーバー表示中でも出てる時計とか…。
第一引数に0とか-3とか入れてみたんですけど…。

編集 削除
Say  2001-07-10 00:39:43  No: 74633  IP: [192.*.*.*]

タイマイベントで
HWND_TOPMOST を
設定しまくる、という手はあるけど・・・
特に時計だったら・・・。

編集 削除
あっぴ  2001-07-10 09:18:55  No: 74634  IP: [192.*.*.*]

すみません。説明が足りなかったみたいです。
ずっと手前に表示するんではなくて、その時1度だけでいいんです。
そうするとやはりBringWindowToTopだと思うんですが??
SetWindowPosだと、ずっと手前に表示されるみたいなので…。

編集 削除
たかみちえ  URL  2001-07-10 17:17:15  No: 74635  IP: [192.*.*.*]

>  タイマイベントで
>  HWND_TOPMOST を
>  設定しまくる、という手はあるけど・・・
  そ、それもありそうですけど…^^;
  でも、スクリーンセーバー表示中に、最前面表示する?
なんだかちがう定数か、ちがうAPIのような…。
でも、さっきAPIびゅーあーでHWNDを検索したら…。
もしかしたらこれかも。
Private Const HWND_BROADCAST = &HFFFF&

  っと、ほんだい。
  一時的に最前面表示するのって、ここのAPIサンプルにあったような…。
後は、一時的に最前面表示して、すぐ切ることもできるし。

編集 削除
あっぴ  2001-07-10 21:42:37  No: 74636  IP: [192.*.*.*]

え〜と、たしかにここのAPIサンプルにあるんですけど、あれを参考に1番最初に書いたソースでEXEファイルを作ったんですが…。

できれば、上のソースをコピーしてやってみてもらえませんか?
標準モジュールに貼り付けるだけですので。
やってみると、ソースだと上手くいくんですが、EXEファイルにすると上手くいかないんです…。
ソースの書き方が悪いでんしょうか?

編集 削除
Say  2001-07-11 01:50:21  No: 74637  IP: [192.*.*.*]

たとえばこうするとか・・・
Private Declare Function BringWindowToTop Lib "user32.dll" _
(ByVal hWnd As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" _
(ByVal hWnd As Long) As Long


Private Sub Form_Load()
Dim ExePath As String
Dim lRet As Long

ExePath = "C:\WINNT\system32\calc.exe"

lRet = FindWindow(vbNullString, "電卓")
If lRet = 0 Then
strWork = Shell(ExePath, vbNormalFocus)
Else
If BringWindowToTop(lRet) = 0 Then
End
ElseIf SetForegroundWindow(lRet) = 0 Then
End
End If
End If

End Sub
ま、フォーカスやれば前面にくるという・・・・

編集 削除
あっぴ  2001-07-11 09:38:14  No: 74638  IP: [192.*.*.*]

解決しました!
SetForegroundWindowを使うと上手くできました。
BringWindowToTopにこだわりすぎたようです…。
(というよりもSetForegroundWindowを知りませんでした)
皆さん、ありがとうございました。

編集 削除