[リストへもどる]
一括表示

投稿時間:2004/02/26(Thu) 18:22
投稿者名:SIN
Eメール:sin1113jp@yahoo.cp.jp
URL :
タイトル:
処理待ち状態について
こんばんは
久々の投稿です。
よろしくお願いします。

VBでACROBATを立ち上げて
指定したファイルを開きその後SENDKEYSステートメントで
操作しようと思っているのですがファイルの大きさがまちまちで
完全に開くのに時間がかかると開く前にSENDKEYSの処理を操作始めてしまい
エラーが発生してしまいます。

今はCALL SLEEP(5000)
で時間を置いて処理していたのですがそれ以上の時間がかかる場合が起こってしまうので
非常に困っています。(それ以上の時間を待てばよいのですが…できれば無駄な時間を消費したくないので)
処理中であるかどうか判断できる良い方法(又は処理待ち状態がわかる関数とか)は無いでしょうか?
よろしくお願い致します。

今現在の処理です↓
APPACTIVATE ACROBAT ←ACROBATをアクティブにする
SENDKEYS "%(F)O" ←ファイル/開く
SENDKEYS OPENFILE ←開くファイル名
SENDKEYS "{ENTER}"

DOEVENTS
CALL SLEEP(5000) ←5秒待つ

SENDKEYS "%F" ←処理(フォームの貼り付け)

投稿時間:2004/02/27(Fri) 11:32
投稿者名:ak
Eメール:
URL :
タイトル:
Re: 処理待ち状態について
入力可能状態になるまで待つにはAPI関数「WaitForInputIdle」を使います。

サンプルを記述しておきますので参考にしてください。

'(*.bas)
Option Explicit

Private Type PROCESS_INFORMATION
    hProcess    As Long
    hThread     As Long
    dwProcessId As Long
    dwThreadId  As Long
End Type

Private Type STARTUPINFO
    cb              As Long
    lpReserved      As String
    lpDesktop       As String
    lpTitle         As String
    dwX             As Long
    dwY             As Long
    dwXSize         As Long
    dwYSize         As Long
    dwXCountChars   As Long
    dwYCountChars   As Long
    dwFillAttribute As Long
    dwFlags         As Long
    wShowWindow     As Integer
    cbReserved2     As Integer
    lpReserved2     As Long
    hStdInput       As Long
    hStdOutput      As Long
    hStdError       As Long
End Type

Private Const STARTF_USESHOWWINDOW = &H1
Private Const NORMAL_PRIORITY_CLASS = &H20&

Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
                                       (ByVal lpApplicationName As String, _
                                        ByVal lpCommandLine As String, _
                                        lpProcessAttributes As Any, _
                                        lpThreadAttributes As Any, _
                                        ByVal bInheritHandles As Long, _
                                        ByVal dwCreationFlags As Long, _
                                        lpEnvironment As Any, _
                                        ByVal lpCurrentDriectory As String, _
                                        lpStartupInfo As STARTUPINFO, _
                                        lpProcessInformation As PROCESS_INFORMATION) As Long

Private Declare Function WaitForInputIdle Lib "USER32" _
                                       (ByVal hProcess As Long, _
                                        ByVal dwMilliseconds As Long) As Long
                                        
'--------------------------------------------------------------------------------------
'概要      :EXE起動(拡張)
'パラメータ:変数名        ,IO ,型             ,説明
'          :sPath         ,I  ,String         ,パス
'          :[sParam]      ,I   ,String        ,パラメータ(任意)
'          :戻り値        ,O  ,Boolean        ,True:成功 False:失敗
'説明      :指定されたアプリを指定されたパラメータで起動し入力可能状態になるまで待機
'--------------------------------------------------------------------------------------
Public Function ShellEx(ByVal sPath As String, Optional ByVal sParam As String = "") As Boolean
    Dim tStInfo As STARTUPINFO
    Dim tPrInfo As PROCESS_INFORMATION

On Local Error GoTo Error_Handler
    
    ShellEx = False
    
    With tStInfo
        .cb = LenB(tStInfo)
        .dwFlags = STARTF_USESHOWWINDOW
        .wShowWindow = 6
    End With
    
    'アプリケーションを起動しプロセス作成する
    If CreateProcess(vbNullString, sPath & " " & sParam, ByVal 0&, _
                     ByVal 0&, 1&, NORMAL_PRIORITY_CLASS, ByVal 0&, _
                     vbNullString, tStInfo, tPrInfo) = 0 Then GoTo Error_Handler

    Do
        If WaitForInputIdle(tPrInfo.hProcess, 100) = 0 Then Exit Do
    Loop
    
    ShellEx = True
    
    Exit Function
'====== エラー処理 ====================================================================
Error_Handler:
    MsgBox "エラーNo:" & Err.Number & vbCrLf & "エラー内容:" & Err.Description, vbCritical
    Err.Clear
End Function

投稿時間:2004/03/01(Mon) 16:41
投稿者名:SIN
Eメール:sin1113jp@yahoo.cp.jp
URL :
タイトル:
Re^2: 処理待ち状態について
akさん ありがとうございました。

無事、入力待ち状態まで待機を実現できました。