少し修正したので貼っておこー
仕様変更
- 60秒のタイムアウトで復元は廃止
- Escキー長押しで復元は廃止
- 二重起動で復元を実行するように修正
バグ修正
- デスクトップ上のアイコンを右クリックして「その他のオプションを確認」を選択すると復元が開始されてしまう動作を修正
- 最小化されている画面も復元してしまっていたので修正
機能追加
- デスクトップの表示時にデスクトップのアイコンにフォーカスを当てるように処理を追加
作ったもの
「デスクトップの表示」のソースファイル
#SingleInstance force
#WinActivateForce
; define
DATA_FILE := "デスクトップの表示.dat"
DESKTOP_CLASS := "ahk_class Progman"
POPUP1_CLASS := "XamlExplorerHostIslandWindow_WASDK"
POPUP2_CLASS := "WorkerW"
; ----------------------------------------
; helper function
; ----------------------------------------
getString(hwndList) {
ret := ""
for index, value in hwndList
ret .= "|" . value
return LTrim(ret, "|")
}
restoreWindow(hwndList, statusList) {
for index, value in hwndList {
reverseIndex := hwndList.Length - index + 1
hwnd := Integer(hwndList[reverseIndex])
if WinExist(hwnd)
if (statusList[reverseIndex] != -1) ; skip minimize window
WinActivate(hwnd)
}
}
; ----------------------------------------
; duplicate run
; ----------------------------------------
if FileExist(DATA_FILE) {
; read data file
FileObj := FileOpen(DATA_FILE, "r")
hwndString := FileObj.ReadLine()
hwnd := StrSplit(hwndString, "|")
statusString := FileObj.ReadLine()
status := StrSplit(statusString, "|")
; restore window
restoreWindow(hwnd, status)
; delete data file
FileDelete(DATA_FILE)
; exit
ExitApp
}
; ----------------------------------------
; main process
; ----------------------------------------
; get window handles for restore
hwnd := WinGetList()
; get window status
status := []
for index, value in hwnd
status.Push(WinGetMinMax(value))
; creat data file
FileAppend(getString(hwnd), DATA_FILE)
FileAppend("`n", DATA_FILE)
FileAppend(getString(status), DATA_FILE)
FileAppend("`n", DATA_FILE)
; show desktop and focus
Send "#d"
Sleep 1000
hwndDesktop := WinGetID(DESKTOP_CLASS)
ControlFocus(hwndDesktop)
; get window handles for monitoring
hwnd1 := WinGetList()
; wait new window
WinWaitNotActive WinExist("A")
Loop {
Sleep 500
hwnd2 := WinGetList()
try {
className := WinGetClass("A")
if ((className != POPUP1_CLASS) && (className != POPUP2_CLASS))
if getString(hwnd1) != getString(hwnd2)
break
} catch {
} finally {
activeId := WinExist("A")
hwnd2 := WinGetList()
}
}
; restore window
restoreWindow(hwnd, status)
; active new window
try {
WinActivate(activeId)
} catch {
WinActivate(hwnd2[1])
}
; delete data file
if FileExist(DATA_FILE)
FileDelete(DATA_FILE)
インストール手順/野良EXE…
以下の2ファイルを差し替えてください。
C:\tool\desktop
├─デスクトップの表示.ahk
└─デスクトップの表示.exe
ショートカットファイルの再作成は不要です。
タスクバーの最左端にショートカットファイルを配置し、「Win」+「1」キーで実行する使用方法を想定しています。「Win」+「Tab」、「Alt」+「Tab」などと共に使用してください。
機能追加予定
たまに動作おかしいのでまたバグ修正するかもしれません。
備忘
いじわるテストするとすぐに不具合が発生する。
プロセスの一覧に変更があったことを検知して画面の復元を開始しているが、デスクトップを表示して1秒未満でアプリを実行されると画面の復元が開始できない。Autohotkeyで正しくプロセスの一覧が取得できるようになるまでタイムラグがあり1秒待ちを外すとプロセスを正しく監視できない。
また、起動されるアプリについても多様なアプリが存在していてプロセスの一覧が変わったからといって画面を復元するためのウインドハンドルが取得できるわけではないため、ここでも待ち時間が必要となり動きとしては復元開始までにタイムラグが発生してしまっている。動きがもっさりして気持ち悪いが、仕方ないかと。
デスクトップを表示した後、以下のようなアプリや操作ではプロセスの状態が正しく取得できず画面が復元されない場合がある。
- スプラッシュ画面が表示されるような起動時間が長いアプリを起動する
- スタートメニューやタスクビューを操作する
- タスクマネージャーなどWindowsのシステムのアプリを最小化から復元する
二重起動したら画面を復元するようにしたので画面の配置を壊して終わることはなくなったが、正しく動かないケースが多々あると思われる。
コンパイル方法
自分でソースを修正するような人は、そもそもこんなツールは使わないのかもしれないけれど、個々の環境で待ち時間のチューニングなどが必要かもしれないのでコンパイル方法を記載しておきます。
- スタートメニューで「AutoHotkey Dash」を選択する。
2. 「Compile」を選択する。
初回の選択時にコンパラがインストールされます。
3. 「Compile」を起動し、「Base File」を選択を「Sava」ボタンをクリックします。
4. 「デスクトップの表示.ahk」ファイルを右クリックし、「Compile script(GUI)」を選択します。
C:\tool\desktop
├─デスクトップの表示.ahk
└─デスクトップの表示.exe
5. 「Convert」ボタンをクリックします。
→「デスクトップの表示.exe」が生成されます。
コンパイル方法を書いておけば怪しげなEXEファイルを添付する必要がないかもしれない。これを貼っておこー
「デスクトップの表示.ahk」を直接実行できるが、「デスクトップの表示.ahk」をタスクバーにピン止めするとアイコンが変更できない。アイコンを変更するためにはEXEファイルのショートカットである方が都合が良いとの理由でEXEを添付したのだけど、怪しげな野良EXEセキュリティ的には実行したくはないよな。
Windows セキュリティに除外を追加する
環境によっては、「C:\tool\desktop」フォルダに対して除外の設定が必要かもしれない。
コメントを残す