リモートデスクトップのアイドルタイムアウトを防ぐ
注意事項
ローカルPCが画面ロック状態の場合、特定ウィンドウのアクティブ化が働かないため、別途画面ロックを防ぐ方法を導入すること
管理者権限で当スクリプトを起動すること
v2
code:activate_rdp_and_key_sending.ahk
;-----------------------------------------------------------------------------
; 一定間隔でRDPのウィンドウをアクティブ化し、元のウィンドウにフォーカスを戻す
/*
RDPClass := "ahk_class #32770" ; こちらはmstsc.extの起動画面 */
RDPClass := "ahk_class TscShellContainerClass" ; こちらがRDPでログインした時のウィンドウ
; 監視対象を尋ねる
Loop {
UserInput := InputBox("監視したいリモートデスクトップ接続先 (IPアドレスまたはホスト名、FQDN等) を入力してください。", "RDP監視対象設定", , "127.0.0.1")
if UserInput.Result = "OK" and UserInput.Value != "" {
RDPText := UserInput.Value
break
}
}
; 監視間隔を尋ねる
Loop {
TimerIntervalMin := InputTimeoutValueBox()
} Until TimerIntervalMin > 0
ActivateRdpWindow()
;-----------------------------------------------------------------------------
; 監視間隔を尋ねるInputBox
; - 入力に間違いがある場合はいつまでもしつこく聞き返す
; - キャンセルや入力タイムアウト時はデフォルトの60分で監視間隔を設定する
; return::
; Float: 監視間隔(分)
InputTimeoutValueBox()
{
try {
UserInput := InputBox("リモートデスクトップを一定時間監視します。監視間隔(分)を入力してください。", "RDP監視間隔設定", , "60")
if UserInput.Result = "OK"
return Float(UserInput.Value)
else
return 60
} catch TypeError as e {
return 0
}
}
ActivateRdpWindow()
{
; 監視タイマー設定を解除
SetTimer ActivateRdpWindow, 0
try {
; RDPが開いていなければ何もせず終了
if !WinExist(RDPClass, RDPText) {
return
}
; 入力をブロックする
; ※管理者ユーザーでプログラムを起動しないと有効にならないっぽい
BlockInput true
; アクティブなウィンドウを記憶する
ActiveWinId := WinGetID("A")
if !ActiveWinId {
return
}
/*
; 管理者権限でこのプログラムを起動できない場合
; 誤入力を防ぐため、ユーザーにInputBoxを表示して入力を止めるのを促す
InputBox("このダイアログを閉じるとリモートデスクトップをアクティブ化します。ダイアログは30秒経つかOK/Cancelいずれかで閉じます。ボックスに入力された文字列はあなたが直前に打っていたキーストロークです。必要に応じてキーストロークから打っていた内容を復元することをおすすめします。", "RDPアイドルタイムアウト抑止", "T30")
*/
WinActivate(RDPClass, RDPText)
WaitRdpWinId := WinWaitActive(RDPClass, RDPText, 5)
if !WaitRdpWinId {
return
}
SendInput "{Ctrl}"
WaitKey := KeyWait("Ctrl", "T1")
TimeIntervalMinForDisplay := TimerIntervalMin >= 1 ? Round(TimerIntervalMin) : Round(TimerIntervalMin, 2)
TrayTip "リモートデスクトップをアクティブにしました。次回のアクティブ化は" TimeIntervalMinForDisplay "分後です。", "RDP監視"
; 元々アクティブだったウィンドウをアクティブにする
WinActivate "ahk_id " ActiveWinId
WaitActiveWinId := WinWaitActive("ahk_id " ActiveWinId, , 5)
if !WaitActiveWinId {
TrayTip "元のアクティブだったウィンドウをアクティブに戻せませんでした。お手数ですがご自身で元のウィンドウの作業に戻ってください。", "RDP監視"
}
} catch as e {
; エラー処理は特に考えない。握り潰して終了。
} finally {
; 次の監視タイマー設定
SetTimer ActivateRdpWindow, TimerIntervalMin * 1000 * 60
; 入力のブロックを止める
; ※管理者ユーザーでプログラムを起動しないと有効にならないっぽい
BlockInput false
}
}
v1
作るのやめ。
その代わりv2をコンパイルしたexeをアップロード