スクリーンセーバーになった瞬間に実行

スクリーンセーバーになったということは、

何もしない状態、アイドル状態。

もしかして、人が座っていない可能性もある。

そんな状況、アイドル状態をチェック、監視して実行するって、プログラムでアイドル状態を監視は難しい?

代わりにスクリーンセーバーの起動の設定。と、タスクスケジューラのトリガー設定。

タスクスケジューラのトリガーの設定で、タスクの開始を「ワークステーション ロック時」にする。

スクリーンセーバー中にtaskkillを実行

タスクスケジューラでの設定に注意google

スクリーンセーバーを有効にすると何もしない状態、アイドル状態のチェックが以下のVBSでできる。特に、スクリーンセーバー中に実行したい場合は以下のVBSが使えます。こちらからいただきました。m(_ _)m

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery ("SELECT * FROM Win32_Process WHERE Name LIKE '%.scr'")

Set WshShell = WScript.CreateObject("WScript.Shell")
If colProcesses.Count = 0 Then
    '    Wscript.Echo "No Screensaver Event"
Else
   'スクリーンセーバー中は以下を実行する
   WshShell.Run "taskkill /im putty.exe /f",0,True
End If

このVBSをタスクスケジューラで5分ごとに起動します。スクリーンセーバー中で無いと、つまり、使っている時は、何もしません。(コメントアウトWscript.Echo “No Screensaver Event”)。

タスクスケジューラのプログラムの開始のコマンドは、vbsなんでフルパスで指定する。コマンドプロンプトで以下のを実行し、VBS拡張子が登録されていないとファイル名だけでは実行できない。

C:\Users\take>set | findstr EXE
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

batバッチでIf文

文字列の比較は==が使える。

とif文が普通のプログラムを書くのと違って、コマンドなんです!。空白やカッコも使えるんだ。以下はコマンドプロンプト。

(c) 2019 Microsoft Corporation. All rights reserved.
C:\Users\take>
C:\Users\take>set aa=kk
C:\Users\take>if %aa%==kk echo yes
yes
C:\Users\take>if %aa%==jj echo yes
C:\Users\take>if %aa%==jj echo yes else echo no
C:\Users\take>if %aa%==kk echo yes
yes
C:\Users\take>if %aa%==kk echo yes else echo no
yes else echo no
C:\Users\take>if %aa%==kk (echo yes) else (echo no)
yes
C:\Users\take>if %aa%==kssk (echo yes) else (echo no)
no

数値の比較は、=とか<とか<が使えない。

equは、等しい。

equalイコールだろうね。==は文字列として使えるからいいか。

neqは、等しくない。equalはeqとして使うことを覚えるしかないか。

not equalノットで否定だな。VBAのように<>が使えればいいのに。

gtrは、より大きい。>が使えれば。gtrは目立つアルファベット

greaterのgとtとrか。<が使えればいいのに。

geqは、以上。>=が使えれば。gとeq

以上とは、もってうえ、以って上。greater equalか。

leqは、以下。<=がつかえれば。lとeq

less equal。lessレス。より小さい。<=が使えればね。

C:\Users\take>if 1 lss 2 (echo yes) else (echo no)
yes

lssは、より小さい。未満。満たない。<が使えればね。lssは目立つアルファベット

まとめると。

=は、equ
<>は、neq
>は、gtr
>=は、geq
<=は、leq
<は、lss

コマンドでプロキシを設定する

IE、インターネットエクスプローラー。もうIEは古いのかわからないが、設定はこれでないと細かくできない?。Windows10では必要無いかな。

プロキシを使う1(チェック、次図)、使わない0設定。ここでは最後の1、使うに設定している。これはレジストリの書き換えになる。

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 1

この図の状態。

プロキシサーバー172.16.1.1、ポート番号8080の設定の場合

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer /t reg_sz /d "172.16.1.1:8080"

この状態。

Socketの設定の場合、IPアドレス127.0.0.1、ポート番号10000に設定。

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer /t reg_sz /d "socks=127.0.0.1:10000"

この状態

「次で始まるアドレスにはプロキシを使用しない」の設定。/d “192.168.2.1”

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyOverride /t reg_sz /d "192.168.2.1"

レジストリの設定ができても、実体のブラウザは更新されない。はず、だったがWindows10では大丈夫みたい。Windows7時代は活を入れるために一度IEをstartコマンドで実行し、timeoutコマンドは10秒待ちで、強制終了taskkillする。/imはイメージファイル=コマンドファイル。/fが強制。

start /d "C:\Program Files\Internet Explorer\" iexplore.exe
timeout /t 10
taskkill /im iexplore.exe /f

IEを起動するのがポイント。timeoutコマンドでIEが起動したころをみはからって、taskkillコマンドでIEを強制シャットダウン。

puttyの設定、コマンドプロンプトで実行

設定はここここ

ウィンドウを持つアプリってマウス操作で実行。

って思い込んでないすか?。コマンドで実行できればタスクスケジューラに登録。自動化できる。

以下をコマンドプロンプトに入力

putty -load myhome

でも

putty -load myHome

でもどちらも動いた。Hの大文字小文字は関係ないようだ。

上図に見えるmyhomeはレジストリに登録されているらしくファイルでは存在しない。

putty.exeにpathが通ってないと以下のメッセージになる。

‘putty’ は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

昔、MS-DOSのころは確かこれだったですね。

コマンドまたはファイル名が違います。

さて、

Progam Files¥puttyフォルダに移動したらファイル名を見つけることができるので確実に実行できる。

なお、

Puttyを実行するとコマンドプロンプトが開くが、閉じるボタンを押すと毎回以下のウィンドウがでる。

この確認を省略する。以下のチェックを2つ外す。

チェックを外す

batバッチの変数もグローバル変数?

こちらのサイトが詳しいです。

変数って環境変数のことです。環境変数とは文字列。グローバルとは他のプロセスに引き継ぐことができるという意味です。引き継ぐとはプロセスを起動した時点の環境変数の値がコピーされるという意味で、起動後に環境変数を変えてプロセス間でデータの共有をすることはできない。

グローバル、変数と書いたのがややこしいんだろう。

cmd.exe実行中、つまりコマンドプロンプトで、その中でcmdを実行することで環境変数が引き継がれる(グローバル?)ことがわかる。

cmd.exeはコマンドプロンプトのウィンドを共有しますが、ここからnotepad.exeを実行するとメモ帳のウィンドが起動する。notepad.exeでも環境変数aが使える。ただ、notepad.exeは他人が作ったアプリなのでその変数を取り込んで何かすることはできないし、示せないので。

簡易的に別のプロセスが動いているように見えるようにcmdを実行してみます。コマンドプロンプトを共有しないようにstartコマンドを使う。

起動したウインドウを閉じる

taskkillコマンドを使います。

batファイルでインターネットエクスプローラー、ieですね。昔のブラウザかな。これを起動して、3秒後に閉じる。

start /d "C:\Program Files\Internet Explorer\" iexplore.exe
timeout /t 3
taskkill /im iexplore.exe /f

最後にexitを入れるとbatファイルのコマンドプロンプトは無くなる。私はたいていはコマンドプロンプトを開いているので使わない。自動っぽくするにはexitがあるといい。