(AutoHotkey)(CD/DVDのドライブを開け閉めする 編)

 同じルーチンを 呼び出すごとに 「CD/DVDドライブが 開いていたら閉じる 閉じていたら開く」とトグルするというサンプルです

 これは AutoHotkeyの公式ページ や 流行らせるページ に書いてあるサンプルと 基本的には 同じです
ただ 上記のサンプルでは それを 組みこんだ場所によっては 思ったように 動作しなかったりします
それは A_TimeSinceThisHotkey組み込み変数 を参照するタイミングによって起こりうる不具合です
ならば 別の方法で 時間を計測すればいいってことですね

 今回は 関数の形にしてみました、 サブルーチンとして組み込む時は 適当に読み替えてください
引数には "G" とか "V" とか のように ドライブの名前を入れるだけです
[]DiscInsertEject(DriveName)[]
[]{[]
	[]; システムが起動してからの経過時間を 記録します[]
	[]buf := DllCall("kernel32.dll\GetTickCount")[]

	[]; 指定したドライブを開くように命令します[]
	[]Drive, Eject, %DriveName%:[]

	[]; もしも すでにドライブが開いていた状態だと 処理は 即座に 次の行に移りますが[]
	[]; 閉まっていた状態だと ドライブが開いてしまうまで 処理は次に移りません[]
	[]; その差を読み取るために 最初に記録した時間との 時間差を計測します[]
	[]; もしも それが 一秒未満なら ドライブは すでに開いていると判断して[]
	[]; 閉じるように命令します[]
	[]If ( (DllCall("kernel32.dll\GetTickCount") - buf) < 1000 )[]
	[]{[]
		[]Drive, Eject, %DriveName%: ,1[]
	[]}[]
	[]Return[]
[]}[]
呼び出す時は
	[]; CD/DVDドライブの ドライブ名が Vだったら[]
	[]DiscInsertEject("V")[]
ですね