ControlSend / ControlSendText

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

ControlSend Keys , 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関数で変更しない限り、初期設定では非表示ウィンドウは検出されず、非表示テキストは検出されます。ただし、pure HWNDsを使ったときは、DetectHiddenWindowsの設定にかかわらず、非表示ウィンドウは常に検出されます。SetTitleMatchModeで変更しない限り、初期設定ではウィンドウタイトルのどこかにWinTitleまたはExcludeTitleを含んでいればマッチします。

エラー処理

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

備考

Unlike Send, ControlSend ignores SendMode. It uses the operating system's PostMessage function to post keyboard messages.

ControlSendText is similar to ControlSend, except that it sends the individual characters of the Keys parameter without translating {Enter} to Enter, ^c to Ctrl+C, etc. 詳しくは、「テキストモード」をご覧ください。ControlSendで{Raw}や {Text}を使用することも有効です。

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

By default, modifier keystrokes (Ctrl, Alt, Shift, and Win) are sent as they normally would be by the SendEvent function. これにより、コマンドプロンプトなどのコンソールウィンドウで、大文字や制御文字などを適切に検出することができます。また、それ以外の方法で信頼性を向上させることもあります。

特に、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エスケープシーケンス(例:`n)Control関数SendWinampの自動化

メモ帳を最小化して開き、テキストを送信します。この例はクラシック版のメモ帳を必要とするため、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