いつもお世話になっております。
ExcelVBAにおきまして、外部アプリケーション(Oracle系データベースソフト)の起動からログインまでを自動で処理させたいと思っております。
この文の最後に記述しているコードでは、
アイドル状態になるまで待機するという処理を組んでいるのですが、
起動後、入力フォームが表示されるまで読み込みによるラグがあり、
入力可能になる前にデータが送信されてしまいます。
現在、Sleepにより数秒間の待機時間を設けていますが、
PCのスペックによって読み込み時間が上下するため、ほぼ使い物になりません。
IEなどの場合は、入力可能まで待機させるようなAPIが用意されているようですが、
他の外部アプリでは、そういったAPIは存在しないのでしょうか?
また、存在しない場合、何か別の方法で実現させることは可能でしょうか?
ご教示の程、どうか宜しくお願いいたします。
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
' OpenProcess 関数
Private Declare Function OpenProcess Lib "KERNEL32.DLL" ( _
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long _
) As Long
' CloseHandle 関数
Private Declare Function CloseHandle Lib "KERNEL32.DLL" ( _
ByVal hObject As Long _
) As Long
' WaitForInputIdle 関数
Private Declare Function WaitForInputIdle Lib "USER32.DLL" ( _
ByVal hProcess As Long, _
ByVal dwMilliseconds As Long _
) As Long
' 定数の定義
Private Const SYNCHRONIZE As Long = &H100000
Private Const INFINITE As Long = &HFFFF
' -------------------------------------------------------------------------------
' プロセスがアイドル状態になるまで指定したミリ秒数待機します。
'
' @Param lProcessId アイドル状態になるまで待機するプロセスの ID。
' @Param [lMilliseconds] アイドル状態になるまで待機する時間。(省略時は無限)
' -------------------------------------------------------------------------------
Public Sub WaitForInputIdleProcess(ByVal lProcessId As Long, Optional ByVal lMilliseconds As Long = INFINITE)
Dim hProcessHandle As Long
lProcessId = CLng(Shell("C:\SCV8CL\ClientPack\ScMen.exe", vbNormalFocus)) ' Process を開いてハンドルを取得する hProcessHandle = OpenProcess(SYNCHRONIZE, 0&, lProcessId) If hProcessHandle <> 0 Then ' アイドル状態になるまで、指定したミリ秒数待機する Call WaitForInputIdle(hProcessHandle, lMilliseconds) ' アイドル状態 Sleep 250 SendKeys "LoginID", True SendKeys "{Enter}" SendKeys "LoginPass", True SendKeys "{Enter}" SendKeys "{Enter}" ' Process のハンドルを閉じる Call CloseHandle(hProcessHandle) End If
End Sub
Sub test()
Dim lProcessId As Long
Call WaitForInputIdleProcess(lProcessId)
End Sub
まだ回答がついていません
会員登録して回答してみよう