■説明
ウィンドウを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 件のコメント:
コメントを投稿