ControlSend / ControlSendText

キーストロークやテキストをシミュレーションして、ウィンドウやコントロールに送信します。

ControlSendKeys, Control , WinTitle , WinText , ExcludeTitle , ExcludeText
ControlSendText Keys , Control, WinTitle, WinText, ExcludeTitle, ExcludeText

パラメータ

Keys

型:文字列

送信するキー(詳しくはSend関数をご覧ください)文字の送信速度はSetKeyDelay関数で定めます。

Send関数とは異なり、ControlSendではマウスクリックを送信することはできません。その際はControlClickを使用してください。

Control

型:文字列整数またはオブジェクト

省略したときは、ターゲットウィンドウのコントロールではなく、ウィンドウそのものにキーストロークを送信します。その例はAutomating Winampをご覧ください。そうでなければ、コントロールのClassNN、テキストまたはHWNDか、Hwndプロパティを持つオブジェクトを指定します。詳しくはControlパラメータをご覧ください。

WinTitle, WinText, ExcludeTitle, ExcludeText

型:文字列整数またはオブジェクト

もしこれらの項目が未設定または省略されたときは、最後に見つかったウィンドウが使用されます。そうでないときは、WinTitleウィンドウタイトルまたはターゲットウィンドウを識別するための他の基準、および/またはWinTextにターゲットウィンドウの単一のテキスト要素からの部分文字列(付属のWindow Spyユーティリティを使えばわかります)を指定します。

ExcludeTitleExcludeTextはウィンドウのタイトルまたはテキストで除外するために使用します。指定の仕方はWinTitleWinTextに似ていますが、ExcludeTitleはウィンドウのタイトル以外の基準(ウィンドウクラスやHWNDなど)を認識しません。

ウィンドウのタイトルとテキストは大文字と小文字を区別します。DetectHiddenWindows関数 と DetectHiddenText関数で変更しない限り、初期設定では非表示ウィンドウは検出されず、非表示テキストは検出されます。SetTitleMatchMode関数で変更しない限り、初期設定ではウィンドウのタイトルはその中のどこかにWinTitleまたはExcludeTitleを含んでいれば一致します。

エラー処理

ウィンドウまたはコントロールが見つからないときは、TargetErrorがスローされます。

備考

ControlSendTextは、{Enter}Enter^cCtrl+Cなどに変換せずに、Keysパラメータの各文字を送信します。詳しくは、「テキストモード」をご覧ください。ControlSendで{Raw}や {Text}を使用することも有効です。

Controlパラメータが省略された場合、この関数はターゲットウィンドウの最上位にあるコントロール(正しいコントロールであることが多い)、またはコントロールがない場合はウィンドウ自体に送信することで、直接送信しようとします。これは、ウィンドウにコントロールが全くないように見える場合、またはどのコントロールに送信するかを気にする必要がない便利な機能です。

デフォルトでは、修飾キー操作(Ctrl、Alt、Shift、Win)は、Send機能によって通常と同じように送信されます。これにより、コマンドプロンプトなどのコンソールウィンドウで、大文字や制御文字などを適切に検出することができます。また、それ以外の方法で信頼性を向上させることもあります。

特に、ControlSend中にユーザーが積極的にタイピングしている場合や、Altが送信されている場合(Altはアクティブウィンドウのメニューバーをアクティブにするため)には、これらの修飾子イベントがアクティブウィンドウに干渉する場合があります。これは、この例のように、モディファイアのアップとダウンのイベントを明示的に送信することで回避することができます。

ControlSend "{Alt down}f{Alt up}", "Edit1", "Untitled - Notepad".

上記の方法では、ワークステーションがロックされている(ログオンプロンプトで保護されている)状態でも、修飾キーストローク(Ctrl、Alt、Shift、Win)を送信することができます。

コマンドプロンプトなどのコンソールウィンドウに対してControlSendを使用する場合は、BlockInputを使用しないようにしてください。大文字やCtrlなどの修飾キーが正しく機能しなくなる可能性があるためです。

SetKeyDelayの値によって、キーが送信される速度が決まります。ターゲットウィンドウが確実にキー入力を受け取れない場合は、以下の例のようにSetKeyDelayの第2パラメータで押下時間を長くしてみてください。

SetKeyDelay 10, 10
SetKeyDelay 0, 10
SetKeyDelay -1, 0

ターゲットコントロールがEditコントロールまたはそれに類するものであるときは、通常ControlSend関数よりも以下の方が信頼性が高く高速です。

EditPaste("This text will be inserted at the caret position.", ControlName, WinTitle)
ControlSetText("This text will entirely replace any current text.", ControlName, WinTitle)

ControlSendは、一般的にウィンドウのメニューバーを操作することはできません。これを回避するためには、MenuSelect関数を使用します。メニューバーの性質上、それが不可能な場合は、SendMessage Tutorialに従って、目的のメニュー項目に対応するメッセージを発見することを試みることができます。

SetKeyDelay, Escape sequences (e.g. `n) , Control functions, Send, Automating Winamp

メモ帳を最小化して開き、テキストを送信します。この例は、Windows 11以降では、クラシック版のメモ帳を必要とするため、失敗する可能性があります。

Run "Notepad",, "Min", &PID  ; Run Notepad minimized.
WinWait "ahk_pid " PID  ; 表示されるのを待ちます。
; 非アクティブなメモ帳エディットコントロールにテキストを送信します。
; 第3パラメータが省略されているため、最後に見つかったウィンドウが使用されます。
ControlSend "This is a line of text in the notepad window.{Enter}", "Edit1"
ControlSendText "Notice that {Enter} is not sent as an Enter keystroke with ControlSendText.", "Edit1"

Msgbox "Press OK to activate the window to see the result."
WinActivate "ahk_pid " PID  ; 結果を表示します。

コマンドプロンプトを開き、テキストを送信します。この例は、Windows 11以降では、コマンドプロンプトのクラシックバージョンを必要とするため、失敗する可能性があります。

SetTitleMatchMode 2
Run A_ComSpec,,, &PID  ; コマンドプロンプトを実行します。
WinWait "ahk_pid " PID  ; 表示されるのを待ちます。
ControlSend "ipconfig{Enter}",, "cmd.exe"  ; コマンドプロンプトのウィンドウに直接送信します。

エディットコントロールを持つGUIを作成し、テキストを送信します。

MyGui := Gui()
MyGui.Add("Edit", "r10 w500")
MyGui.Show()
ControlSend "This is a line of text in the edit control.{Enter}", "Edit1", MyGui
ControlSendText "Notice that {Enter} is not sent as an Enter keystroke with ControlSendText.", "Edit1", MyGui