Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


40 / 12988 ツリー ←次へ | 前へ→

【78899】アプリケーション起動完了の判定 ちょろすけ 17/2/21(火) 12:14 質問[未読]

【78900】Re:アプリケーション起動完了の判定 ウッシ 17/2/21(火) 15:51 回答[未読]
【78902】Re:アプリケーション起動完了の判定 ちょろすけ 17/2/21(火) 17:33 質問[未読]
【78904】Re:アプリケーション起動完了の判定 ウッシ 17/2/21(火) 22:09 回答[未読]
【78905】Re:アプリケーション起動完了の判定 ちょろすけ 17/2/21(火) 22:17 回答[未読]
【78908】Re:アプリケーション起動完了の判定 ちょろすけ 17/2/22(水) 10:17 お礼[未読]

【78900】Re:アプリケーション起動完了の判定
回答  ウッシ  - 17/2/21(火) 15:51 -

引用なし
パスワード
   こんにちは

Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Public Const GW_OWNER = 4
Public flg As Boolean

Public Function GetProc(ByVal hWnd As Long, lParam As Long) As Boolean
  Dim sName As String * 128
  Dim ret  As Long
  
  sName = ""
  ret = GetWindowText(hWnd, s, Len(s))
  
  If IsWindowVisible(hWnd) Then
    If GetWindow(hWnd, GW_OWNER) = 0 Then
      If ret <> 0 Then
        If sName Like "対象のWindowキャプション名*" Then
          flg = True
          Exit Function
        End If
      End If
    End If
  End If
  GetProc = True
End Function


Sub test()
  Dim s As Single
  s = Timer
  flg = False
  Do
    Call EnumWindows(AddressOf GetProc, 0)
    If Timer - s > 10 Then '10秒待ち
      Exit Do
    End If
  Loop Until flg = True
  If flg = False Then
    MsgBox "時間切れ、見つかりません"
  Else
    '見つかったので次の処理
    Stop
  End If
End Sub

こんな感じでどうでしょうか? 


▼ちょろすけ さん:
>皆さま教えて下さい。
>
>あるアプリケーションをShellコマンドで起動させて、起動完了(ウインドウが
>完全に開いた状態)を判定してから次の処理(SendKeysなど)に移りたいの
>ですが、どの様なコードを書けば良いのか行き詰ってます。
>
>(色々調べてみると、アプリケーションを起動させて、終了を確認してから
> 次の処理に移るようなコードはありましたが、今回は起動完了だけを判定
> したいです。)
>
>Do〜Loopとかでも試してみましたが、Shellコマンドが通った時点(ウインドウが
>完全に開く前)で次の処理に移ってしまうので、SendKeysなどがうまく動かない
>のです。
>
>長々とすいません、、宜しくお願い致します。

【78902】Re:アプリケーション起動完了の判定
質問  ちょろすけ  - 17/2/21(火) 17:33 -

引用なし
パスワード
   ウッシさん

ありがとうございます!
ただ、、凄いとしか。
想像以上に複雑過ぎて焦ってます。

もし宜しければ、ポイントになる部分の解説(コメント)もご教示頂けないでしょうか。。
お手数掛けてしまいますが、宜しくお願い致します。


▼ウッシ さん:
>こんにちは
>
>Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
>Public Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
>Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
>Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
>Public Const GW_OWNER = 4
>Public flg As Boolean
>
>Public Function GetProc(ByVal hWnd As Long, lParam As Long) As Boolean
>  Dim sName As String * 128
>  Dim ret  As Long
>  
>  sName = ""
>  ret = GetWindowText(hWnd, s, Len(s))
>  
>  If IsWindowVisible(hWnd) Then
>    If GetWindow(hWnd, GW_OWNER) = 0 Then
>      If ret <> 0 Then
>        If sName Like "対象のWindowキャプション名*" Then
>          flg = True
>          Exit Function
>        End If
>      End If
>    End If
>  End If
>  GetProc = True
>End Function
>
>
>Sub test()
>  Dim s As Single
>  s = Timer
>  flg = False
>  Do
>    Call EnumWindows(AddressOf GetProc, 0)
>    If Timer - s > 10 Then '10秒待ち
>      Exit Do
>    End If
>  Loop Until flg = True
>  If flg = False Then
>    MsgBox "時間切れ、見つかりません"
>  Else
>    '見つかったので次の処理
>    Stop
>  End If
>End Sub
>
>こんな感じでどうでしょうか? 
>
>
>▼ちょろすけ さん:
>>皆さま教えて下さい。
>>
>>あるアプリケーションをShellコマンドで起動させて、起動完了(ウインドウが
>>完全に開いた状態)を判定してから次の処理(SendKeysなど)に移りたいの
>>ですが、どの様なコードを書けば良いのか行き詰ってます。
>>
>>(色々調べてみると、アプリケーションを起動させて、終了を確認してから
>> 次の処理に移るようなコードはありましたが、今回は起動完了だけを判定
>> したいです。)
>>
>>Do〜Loopとかでも試してみましたが、Shellコマンドが通った時点(ウインドウが
>>完全に開く前)で次の処理に移ってしまうので、SendKeysなどがうまく動かない
>>のです。
>>
>>長々とすいません、、宜しくお願い致します。

【78904】Re:アプリケーション起動完了の判定
回答  ウッシ  - 17/2/21(火) 22:09 -

引用なし
パスワード
   こんばんは

済みません、コードの間違いも修正しました。

'API宣言部
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
'定数、変数
Public Const GW_OWNER = 4
Public flg As Boolean
'再帰処理用コールバック関数
Public Function GetProc(ByVal hWnd As Long, lParam As Long) As Boolean
  Dim sName As String * 128
  Dim ret  As Long
  
  sName = ""
  'キャプションを取得
  ret = GetWindowText(hWnd, sName, Len(sName))
  '可視状態のウィンドウを調べる
  If IsWindowVisible(hWnd) Then
    'オーナーフォームのハンドル取得
    If GetWindow(hWnd, GW_OWNER) = 0 Then
      If ret <> 0 Then
        '判定するアプリケーションのキャプション名
        If sName Like "対象のWindowキャプション名*" Then
          '見つかったらフラグをTrueにして、関数から抜ける
          flg = True
          Exit Function
        End If
      End If
    End If
  End If
  GetProc = True
End Function


Sub test()
  Dim s As Single
  s = Timer
  flg = False
  Do
    Call EnumWindows(AddressOf GetProc, 0)
    'フラグがTrueになる前に10秒経過したらループ抜ける
    If Timer - s > 10 Then '10秒待ち
      Exit Do
    End If
  Loop Until flg = True
  '見つかったらフラグはTrue、時間切れならFalse
  If flg = False Then
    MsgBox "時間切れ、見つかりません"
  Else
    '見つかったので次の処理
    Stop
  End If
End Sub

【78905】Re:アプリケーション起動完了の判定
回答  ちょろすけ  - 17/2/21(火) 22:17 -

引用なし
パスワード
   ウッシさん
お相手して下さってありがとうございます。
残念ながら今は確認できる環境が無いので明日試してみたいと思います。
宜しくお願い致します。

▼ウッシ さん:
>こんばんは
>
>済みません、コードの間違いも修正しました。
>
>'API宣言部
>Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
>Public Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
>Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
>Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
>'定数、変数
>Public Const GW_OWNER = 4
>Public flg As Boolean
>'再帰処理用コールバック関数
>Public Function GetProc(ByVal hWnd As Long, lParam As Long) As Boolean
>  Dim sName As String * 128
>  Dim ret  As Long
>  
>  sName = ""
>  'キャプションを取得
>  ret = GetWindowText(hWnd, sName, Len(sName))
>  '可視状態のウィンドウを調べる
>  If IsWindowVisible(hWnd) Then
>    'オーナーフォームのハンドル取得
>    If GetWindow(hWnd, GW_OWNER) = 0 Then
>      If ret <> 0 Then
>        '判定するアプリケーションのキャプション名
>        If sName Like "対象のWindowキャプション名*" Then
>          '見つかったらフラグをTrueにして、関数から抜ける
>          flg = True
>          Exit Function
>        End If
>      End If
>    End If
>  End If
>  GetProc = True
>End Function
>
>
>Sub test()
>  Dim s As Single
>  s = Timer
>  flg = False
>  Do
>    Call EnumWindows(AddressOf GetProc, 0)
>    'フラグがTrueになる前に10秒経過したらループ抜ける
>    If Timer - s > 10 Then '10秒待ち
>      Exit Do
>    End If
>  Loop Until flg = True
>  '見つかったらフラグはTrue、時間切れならFalse
>  If flg = False Then
>    MsgBox "時間切れ、見つかりません"
>  Else
>    '見つかったので次の処理
>    Stop
>  End If
>End Sub

【78908】Re:アプリケーション起動完了の判定
お礼  ちょろすけ  - 17/2/22(水) 10:17 -

引用なし
パスワード
   ウッシさん
動作させてみたところ無事に動きました。
追加して頂いたコメントは、これから勉強させていただきたいと思います。
助かりました、ありがとうございました。

▼ちょろすけ さん:
>ウッシさん
>お相手して下さってありがとうございます。
>残念ながら今は確認できる環境が無いので明日試してみたいと思います。
>宜しくお願い致します。
>
>▼ウッシ さん:
>>こんばんは
>>
>>済みません、コードの間違いも修正しました。
>>
>>'API宣言部
>>Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
>>Public Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
>>Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
>>Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
>>'定数、変数
>>Public Const GW_OWNER = 4
>>Public flg As Boolean
>>'再帰処理用コールバック関数
>>Public Function GetProc(ByVal hWnd As Long, lParam As Long) As Boolean
>>  Dim sName As String * 128
>>  Dim ret  As Long
>>  
>>  sName = ""
>>  'キャプションを取得
>>  ret = GetWindowText(hWnd, sName, Len(sName))
>>  '可視状態のウィンドウを調べる
>>  If IsWindowVisible(hWnd) Then
>>    'オーナーフォームのハンドル取得
>>    If GetWindow(hWnd, GW_OWNER) = 0 Then
>>      If ret <> 0 Then
>>        '判定するアプリケーションのキャプション名
>>        If sName Like "対象のWindowキャプション名*" Then
>>          '見つかったらフラグをTrueにして、関数から抜ける
>>          flg = True
>>          Exit Function
>>        End If
>>      End If
>>    End If
>>  End If
>>  GetProc = True
>>End Function
>>
>>
>>Sub test()
>>  Dim s As Single
>>  s = Timer
>>  flg = False
>>  Do
>>    Call EnumWindows(AddressOf GetProc, 0)
>>    'フラグがTrueになる前に10秒経過したらループ抜ける
>>    If Timer - s > 10 Then '10秒待ち
>>      Exit Do
>>    End If
>>  Loop Until flg = True
>>  '見つかったらフラグはTrue、時間切れならFalse
>>  If flg = False Then
>>    MsgBox "時間切れ、見つかりません"
>>  Else
>>    '見つかったので次の処理
>>    Stop
>>  End If
>>End Sub

40 / 12988 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free