■説明
ウィンドウをZオーダーの先頭に持ってくる関数
■宣言
Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
第一引数:ウィンドウのハンドルを指定
戻り値:失敗した時0を返します
■サンプルコード
サンプルでは、電卓アプリを手前に表示するコードです。
FindWindow関数を使ってハンドルを取得しています。
ExcelVBAで同様のことをするには、AppActivate関数を使うとよいですね。
第一引数には、ウィンドウのタイトルかプロセス値のどちらかを指定する必要があります。
存在しない場合エラーとなるため、エラー処理が必要になります。
そのまま終了させるならOn Error
ウィンドウが表示されるまで時間がかかるから
ループで待つのなら、On Error Resume Nextで
処理を止めない等のやり方ですね。
(ループさせる時は、タイムアウトさせる必要もあり)
ウィンドウをZオーダーの先頭に持ってくる関数
■宣言
Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
第一引数:ウィンドウのハンドルを指定
戻り値:失敗した時0を返します
■サンプルコード
サンプルでは、電卓アプリを手前に表示するコードです。
FindWindow関数を使ってハンドルを取得しています。
Option Explicit
Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Sub SampleCode()
Dim hwnd As Long
hwnd = FindWindow("SciCalc", "電卓")
Dim Ret As Integer
Ret = BringWindowToTop(hwnd)
If Ret = 0 Then MsgBox "アクティブにできませんでした"
'参考までに戻り値を表示してみる
Debug.Print Ret '成功したら1が戻ってきた
End Sub
ExcelVBAで同様のことをするには、AppActivate関数を使うとよいですね。
第一引数には、ウィンドウのタイトルかプロセス値のどちらかを指定する必要があります。
存在しない場合エラーとなるため、エラー処理が必要になります。
そのまま終了させるならOn Error
ウィンドウが表示されるまで時間がかかるから
ループで待つのなら、On Error Resume Nextで
処理を止めない等のやり方ですね。
(ループさせる時は、タイムアウトさせる必要もあり)
Option Explicit
Sub SampleCode2()
On Error Resume Next
AppActivate ("電卓")
If Err.Number <> 0 Then MsgBox "アクティブにできませんでした"
GoTo 0
End Sub
Sub SampleCode3()
Dim TimeOut As Integer: TimeOut = 5 '存在しない時は、5秒でループを抜ける
Dim BaseTime As Double: BaseTime = Timer()
On Error Resume Next
Do
On Error GoTo 0 'エラー初期化
AppActivate ("電卓")
'エラーが無ければ抜ける
If Err.Number = 0 Then Exit Do
'タイムアウトチェック
If TimeOut < (Timer() - BaseTime) Then
MsgBox "タイムアウトしました"
Exit Do
End If
'Timer関数は0時になると値が0に戻るので
'0時をまたぐとTimer() - BaseTimeは負の値となり
'いつまでもタイムアウトしないので負の値だと別に
'エラー表示する必要がある。
If (Timer() - BaseTime) < 0 Then
MsgBox "0時またぎエラー"
Exit Do
End If
Loop
End Sub
0 件のコメント:
コメントを投稿