AppActivate メソッドリファレンス:
アプリケーション ウィンドウをアクティブにします。
- 構文:
object.AppActivate title
- 引数:
- オブジェクト:
WshShell
オブジェクト。
- title : アクティブ化するアプリケーションを指定します。これは、アプリケーションのタイトル(タイトル バーに表示される) またはアプリケーションのProcess IDを含む文字列です。
に指定された文字列が、 の目的のインスタンスのobjShell.AppActivate
タイトルまたはそのProcess IDであることを確認してください。Program.exe
SendKeys メソッドのリファレンスに加えて、 Sending Keystrokes to a Program をお読みください。この記事では、 任意のスクリプトの根本的な不足について説明します - タイミングの問題:
キーストロークをアプリケーションに送信することは、手順を自動化するための最適な方法ではないことに注意してください。企業内に自動化する必要のあるアプリケーションがあり、そのアプリケーションに COM ベースのオブジェクト モデルがない場合は、この手法を検討できます。ただし、その特定のアプリケーションを自動化するための他の方法が存在するかどうかを最初に調べる必要があります。
効果的SendKeys
に使用できますが、このアプローチにはいくつかの潜在的な問題があります。
- スクリプトは、キーストロークを送信するウィンドウを決定するのが難しい場合があります。
- アプリケーションは GUI モードで実行されるため、ユーザーがアプリケーションを途中で閉じる可能性があります。残念ながら、これでスクリプトは終了せず、スクリプトがキーストロークを間違ったアプリケーションに送信してしまう可能性があります。
- スクリプトは、アプリケーションとの同期に問題がある可能性があります。
スクリプトは GUI アプリケーションよりもはるかに高速に実行される傾向があるため、このタイミングの問題は特に厄介です。
…</p>
と使用AppActivate
:
キーストロークをアプリケーションに送信する前に、アプリケーションが実行中であり、フォーカスがアプリケーションにある (つまり、アプリケーションがアクティブなウィンドウで実行されている) ことを最初に確認する必要があります。
…
スクリプトをループに入れて、戻り値が True になるまで定期的に AppActivate を呼び出すことができます。その時点で、アプリケーションがロードされ、キーストロークを受け入れる準備が整います。
…<BR>スクリプトが起動するアプリケーションを決定するとき、指定されたタイトルが画面上に表示されている各ウィンドウのタイトルと比較されます。完全に一致するものが存在しない場合、AppActivate
メソッドは、タイトルが指定されたテキストで始まる最初のウィンドウにフォーカスを設定します。. それでもウィンドウが見つからない場合は、タイトル文字列がテキストで終わる最初のウィンドウにフォーカスが与えられます。タイトル バーの先頭および末尾のテキストとの部分一致によりAppActivate
、現在開いているドキュメントの名前をタイトル バーに表示するメモ帳などのアプリケーションで が動作することが保証されます。(たとえば、最初に を起動したとき
Notepad
、ウィンドウのタイトルはUntitled - Notepad
ではなくNotepad
です。)
…<BR>
(上記の引用は、私の強調したダイジェストです。ここで記事全体を引用するには長すぎます。)
編集します。
どのウィンドウが現在フォーカスされているかは実際にはわからないため、そのメソッドがキーストロークをアクティブなウィンドウの目に見えないサイトSendKeys
に送信することを考えてみましょう。Run Method (Windows Script Host)の完全な構文を活用してください。ウィンドウ スタイルの意味は次のとおりです。objShell.Run sCmdLine, 1, False
1
1
ウィンドウをアクティブにして表示します。ウィンドウが最小化または最大化されている場合、システムはウィンドウを元のサイズと位置に復元します。アプリケーションは、ウィンドウを初めて表示するときに、このフラグを指定する必要があります。
次のサンプル スクリプトを使用してテスト済み (理解を深めるためにコメント付き):
option explicit
On Error GoTo 0
Dim objShell, sProgram, sTxtFile, sTxtPath, sCmdLine, sTxtExists
Set objShell = WScript.CreateObject( "WScript.Shell" )
sProgram = "C:\Windows\System32\notepad.exe"
sTxtFile = Replace( Wscript.ScriptName, ".vbs", ".txt", 1, -1, vbTextCompare)
sTxtPath = CreateObject("Scripting.FileSystemObject").BuildPath( _
objShell.ExpandEnvironmentStrings("%temp%"), sTxtFile)
sTxtExists = CreateObject("Scripting.FileSystemObject").FileExists(sTxtPath)
' delete file merely for testing and debugging to ensure that
' `NOTEPAD` will ask whether create nonexistent file
If sTxtExists Then CreateObject("Scripting.FileSystemObject").DeleteFile( sTxtPath)
WScript.Sleep 500 ' wait for deleting
sCmdLine = """" & sProgram & """ """ & sTxtPath & """"
objShell.Run sCmdLine, 1, False
' this `1` activates currently launched notepad
' and its possible initial dialogue takes focus
WScript.Sleep 1000 ' hence, `AppActivate` is not necessary
' alternative to `DeleteFile( sTxtPath)`
' If NOT sTxtExists Then ' answer initial dialogue only if necessary
objShell.SendKeys "{TAB}"
WScript.Sleep 100
objShell.SendKeys "{TAB}"
WScript.Sleep 100
objShell.SendKeys "{TAB}"
WScript.Sleep 100
objShell.SendKeys "{ENTER}"
WScript.Sleep 100
' End If
objShell.SendKeys Cstr(Now)
WScript.Sleep 100
ただし、ランチャーには別のタイミングとフォーカスの問題があります。Pythonでtime.sleep(2)
十分でしょうか?確かにそうではありません: すべてのスクリプトは、最初のスクリプトが2 秒ごとに起動されるvbs
前に 3 秒待機します!SendKeys
同等のバッチ スクリプト: Timeout
commandは、指定された秒数だけコマンド プロセッサを一時停止します。
末尾1>NUL
は出力カウントダウンを非表示にしますWaiting for X seconds, press CTRL+C to quit ...
for /r "." %%a in (*.vbs) do (
C:\Windows\System32\wscript.exe "%%~fa"
timeout /T 5 /NOBREAK 1>NUL
)
5秒でいいの?