Windows11の24H2にて、はるか昔から
- フォルダーオプション:ログオン時に以前のフォルダーウィンドウを表示する
- サインイン オプション:再起動可能なアプリを自動的に保存し、再度サインインしたときに再起動する
の両方はONにしてありますが、いつの頃からだか覚えていませんがパソコンを再起動しても直前に開いていたフォルダが自動で開きません。
つまり上記2つの設定はフォルダに関しては機能していません。
というか、たぶんWindows11あるいは24H2が悪いです。
端的に言えば、Windows11のファイルエクスプローラーの出来が非常に悪いです!
Windows11にしてからだったか、いつの頃からだったのか覚えていませんが、パソコン再起動時に以前のフォルダーウィンドウを表示することができなくてずっと諦めていましたがこの上なく使い勝手が悪いので、今回色々と試行錯誤してどうにかほぼ完璧に解決できました!
以下の2つは今回の解決策の前に、とっくの昔から私は有効にしてある設定項目です。
チェックONにしてない場合は、一応両方ともONにしてみて下さい。
それだけで、ログオン時に以前のフォルダーウィンドウを表示できるようになる場合もあるみたいです。
私は下記2項目ONでもダメでしたけど。
フォルダーオプションでの設定
■フォルダーオプションにて、
ログオン時に以前のフォルダーウィンドウを表示する
をチェックON
私の場合は機能していません。
24H2で設定無効になったと聞きます。
サインイン オプションでの設定
再起動可能なアプリをPC再起動時に自動起動する
■設定 → アカウント → サインイン オプションにて、
再起動可能なアプリを自動的に保存し、再度サインインしたときに再起動する
をON
ブラウザはPC再起動後に自動で開きますが、私の場合はフォルダに関しては開きません。
全く使えねえな、24H2は!
「ログオン時に以前のフォルダーウィンドウを表示する」をAutoHotkeyでほぼ完璧に解決しました!
結論だけ先に書きますと、AutoHotkeyにて”ほぼ完璧に”ログオン時に以前のフォルダーウィンドウを表示することができました。
厳密には、シャットダウン30秒前に開いていたフォルダをPC再起動後に自動で開きます。
※この「30秒前」という数値は自由に変更できますが、ひとまず「30秒前」で様子見しています。
以下、AutoHotkeyのV2にて
ログオン時に以前のフォルダーウィンドウを表示できない
をほぼ解決した、その手順です。
AutoHotkeyのV2をインストールする
にて
AutoHotkeyのV2をインストールします。
Download → Download v2.0、です。
インストールしたら
C:\Program Files\AutoHotkey\v2
内にAutoHotkey.exeがある、つまり
C:\Program Files\AutoHotkey\v2\AutoHotkey.exe
があることを確認して下さい。
V1とV2ではAutoHotkey.exeが存在するフォルダも後述のコード(V2用)も違うのでご注意下さい。
インストールするのはAutoHotkey V2です。
開いているフォルダ一覧を30秒ごとに記録して、PC再起動時にその一覧のフォルダを自動で開くAutoHotkeyファイルを作成する
AutoHotkey(V2)を使って、開いているフォルダ一覧を30秒ごとに記録して、PC再起動時にその一覧のフォルダを自動で開くようにします。
拡張子「.ahk」のファイルを2つ作成してスタートアップに登録します。
■全体の作業手順■
■%userprofile%\Documents\AutoHotkey
のフォルダ内にて、新規作成 → テキスト ドキュメントで2つtxtファイルを作成する。
※「Documents」フォルダ内に「AutoHotkey」フォルダがない場合は作成してください。
上記フォルダは、Winキー + Rで
%userprofile%\Documents\AutoHotkey
と入力してエンターで開きます。
↓
■それぞれ、後述の
- save_open_folders-30seconds.ahk
- open_saved_folders.ahk
のコードをコピペして保存する。
どちらも
文字コード:UTF-8
改行コード:CR+LF
です。
↓
■それぞれのファイル名を
- save_open_folders-30seconds.ahk
- open_saved_folders.ahk
と変更する。
↓
■スタートアップに
- save_open_folders-30seconds.ahk
- open_saved_folders.ahk
それぞれのショートカットを登録する。
↓
パソコンを再起動する。
save_open_folders-30seconds.ahkのコード
#Requires AutoHotkey v2.0
saveFile := A_MyDocuments "\AutoHotkey\open_folders.txt"
prevFile := A_MyDocuments "\AutoHotkey\open_folders_prev.txt" ; 前回の内容を保存するファイル名
; 初回実行
SaveOpenFolders()
; タイマー設定
SetTimer(SaveOpenFolders, 30000) ; 30秒おき
SaveOpenFolders() {
global saveFile, prevFile
local folders, list, hwnd, title, potentialPath, file, currentContent, prevContent
; 1. 現在開いているフォルダを取得
folders := ""
list := []
try {
list := WinGetList("ahk_class CabinetWClass")
} catch {
list := [] ; エラー時は空リスト
}
if IsObject(list) && list.Length > 0 {
for hwnd in list { ; Outer For Start
try { ; Outer Try Start
if WinExist("ahk_id " hwnd) { ; Outer If 1 Start
title := WinGetTitle("ahk_id " hwnd)
if (title != "") { ; Outer If 2 Start
potentialPath := Trim(title)
if RegExMatch(potentialPath, "^([a-zA-Z]:\\|\\\\)") && !InStr(potentialPath, "::{") { ; Outer If 3 Start
isDuplicate := false
for _, existing in StrSplit(folders, "`n", "`r") { ; Inner For Start
if Trim(existing) = potentialPath { ; Inner If Start
isDuplicate := true
break
} ; Inner If End
} ; Inner For End
if !isDuplicate { ; Outer If 4 Start
folders .= potentialPath . "`n"
} ; Outer If 4 End
} ; Outer If 3 End
} ; Outer If 2 End
} ; Outer If 1 End
} catch {
; 空のブロック。エラーは無視して次のループへ
} ; Outer Try End
} ; Outer For End
}
; 2. 書き込む内容を決定 (空ならマーカー)
currentContent := ""
if (Trim(folders) != "") {
currentContent := Trim(folders, "`n")
} else {
currentContent := "NO_OPEN_FOLDERS"
}
; 3. 前回の内容と比較し、異なっていれば prevFile を更新
prevContent := ""
try {
prevContent := FileRead(saveFile, "UTF-8")
} catch {
prevContent := ""
} ; 前回の saveFile の内容を読む
if (currentContent != prevContent) {
if (Trim(prevContent) != "" && !InStr(prevContent, "NO_OPEN_FOLDERS")) {
try {
file := FileOpen(prevFile, "w", "UTF-8")
if IsObject(file) {
file.Write(prevContent)
file.Close()
}
} catch {
; エラー時は無視
}
} else if FileExist(prevFile) {
try {
FileDelete(prevFile)
} catch {
; エラー時は無視
}
}
}
; 4. 新しい内容 (currentContent) を saveFile に書き込み
try {
file := FileOpen(saveFile, "w", "UTF-8")
if IsObject(file) {
file.Write(currentContent)
file.Close()
}
} catch {
; エラー時は無視
}
}
open_saved_folders.ahkのコード
#Requires AutoHotkey v2.0
saveFile := A_MyDocuments "\AutoHotkey\open_folders.txt"
prevFile := A_MyDocuments "\AutoHotkey\open_folders_prev.txt" ; ★変更:バックアップとして prevFile を参照
content := ""
sourceFile := ""
; まず saveFile を試す
try {
content := FileRead(saveFile, "UTF-8")
} catch {
content := ""
}
OutputDebug("saveFile Content: " (content != "" ? StrLen(content) . " chars" : "Empty or Read Error"))
; saveFile が空、読めない、またはマーカーの場合は prevFile を試す
if (Trim(content) = "" || InStr(content, "NO_OPEN_FOLDERS")) {
OutputDebug("saveFile is invalid, trying prevFile...")
try {
content := FileRead(prevFile, "UTF-8")
} catch {
content := ""
}
OutputDebug("prevFile Content: " (content != "" ? StrLen(content) . " chars" : "Empty or Read Error"))
; prevFile も空、読めない、またはマーカーなら諦める
if (Trim(content) = "" || InStr(content, "NO_OPEN_FOLDERS")) {
content := "" ; 復元対象なし
OutputDebug("prevFile is also invalid. No restore target.")
} else {
sourceFile := prevFile ; prevFile から復元
OutputDebug("Using prevFile for restore.")
}
} else {
sourceFile := saveFile ; saveFile から復元
OutputDebug("Using saveFile for restore.")
}
; 復元対象があれば実行
if (content != "") {
OutputDebug("Restoring folders from: " sourceFile)
Loop Parse, content, "`n", "`r" {
line := Trim(A_LoopField)
if (line != "") {
try {
OutputDebug("Running: " line)
Run line
Sleep 100 ; 少し待機
} catch {
OutputDebug("Run Error for line: " line)
MsgBox("フォルダを開けませんでした: " line, "復元エラー", 48)
}
}
}
} else {
OutputDebug("No folders to restore.")
}
ExitApp
上記2つのファイルのショートカットをスタートアップに登録する
%userprofile%\Documents\AutoHotkey
のフォルダ内に保存した
- save_open_folders-30seconds.ahk
- open_saved_folders.ahk
の2つのファイルのそれぞれのショートカット
- save_open_folders-30seconds.ahk - ショートカット.lnk
- open_saved_folders.ahk - ショートカット.lnk
をスタートアップに登録します。
スタートアップのフォルダは
Winキー + Rにて、
shell:startup
で開きます。
再起動する
パソコンを再起動すれば作業完了です!
以上で、パソコン起動時に
- open_saved_folders.ahkが1度だけ実行され、open_folders.txtにあるフォルダが開かれる。※細かい仕様は後述します。
- save_open_folders-30seconds.ahkが実行され常駐、以後30秒ごとにopen_folders.txtを作成・更新される。
これでひとまず擬似的にログオン時に以前のフォルダを開くことができます。
本当は
- Windowsのシャットダウン処理をフックして、シャットダウン直前に開いていたフォルダ一覧を確実に保存する
を実行したくて何時間も格闘しましたが結局うまくいかず、
- 安定的かつある程度確実にシャットダウン時に近い状態のフォルダ全てを開くには、上記の方法がベター
という結論に至りました、というか、上記以外ではうまくいきませんでした><
1点注意点というか念のため書いておきますと
■注意■
save_open_folders-30seconds.ahkの
SetTimer(SaveOpenFolders, 30000) ; 30秒おき
は
シャットダウン時に全てのフォルダが閉じられるまでの時間 × 2
より大きな数値を設定する必要があります。
たぶん30秒なら問題ないはずです。
最初は10秒ごとにしたのですが、シャットダウンの処理が始まって、もし
- すぐに全てのフォルダが閉じられる
- その後例えばブラウザやexcel等のファイルを閉じる処理が5秒以上かかった
- この段階ではまだsave_open_folders-30seconds.ahkが動いている(かもしれない)
- その後にシャットダウン処理が全て完了した
としたら、最後のopen_folders.txtは後述の「NO_OPEN_FOLDERS」と記述されるので、再起動後に1つもフォルダが開かれなくなります。
その閾値がわからないので、ひとまず30秒ごとにしました。
なお、CPU使用率は限りなく低いので(仮に1秒ごとに変更しても)負荷を気にする必要はありません。
上記2ファイルの細かい仕様の説明
上記2ファイルの挙動・仕組みを説明しますと、
■save_open_folders-30seconds.ahk
save_open_folders-30seconds.ahkは常駐しますが、CPU使用率は1%以下・・・かどうかは不明ですが、限りなく少ない負荷です。
- パソコン起動時にsave_open_folders-30seconds.ahkが実行され常駐します。
- 30秒ごとにopen_folders.txtを作成・更新します。
- open_folders_prev.txt はすぐには作成されません。
- open_folders.txtの内容が変化したらopen_folders_prev.txtを作成します(※1)
- フォルダを1つも開いていない、つまり意図的に空でない場合(※2)はopen_folders.txtに「NO_OPEN_FOLDERS」と記述します。
※1 従ってopen_folders_prev.txtは、最低でも30秒前より古い状態かつopen_folders.txtとは違う内容となります。
open_folders.txtが何らかの理由で壊れた・開けない場合の少し前のフォルダ一覧がopen_folders_prev.txtというイメージです。
■open_saved_folders.ahk
open_saved_folders.ahkはPC起動時に1回だけ実行されます。
open_saved_folders.ahkの処理は少し複雑です。
※2 「意図的に空でない場合」とは、自分の意志でフォルダを1つも開いていない状態のことです。
意図的にフォルダを1つも開いていない場合はopen_folders.txtの中身は
NO_OPEN_FOLDERS
と1行書いてあります。
「意図的に空でない場合」以外で空になる場合とは、何らかの理由でopen_folders.txtの中身が空になった場合です。
再起動時の流れ
PC起動時にopen_saved_folders.ahkはまず最初にopen_folders.txtを読み込もうとします。
■open_folders.txtが存在し、内容が読み込めて、かつその内容が NO_OPEN_FOLDERS の場合は1つもフォルダは開きません。
意図的に1つもフォルダを開いてない状態で再起動した場合がこれです。
■open_folders.txtが存在し、内容が読み込めて、かつその内容が NO_OPEN_FOLDERS でも空文字列でもない場合は、open_folders.txt の内容でフォルダを開きます。
複数フォルダを開いている状態で再起動した場合がこれです。
”擬似的に”ログオン時に以前のフォルダーウィンドウを表示する、がこれです。
■上記の条件に当てはまらなかった場合、つまりopen_folders.txt が存在しない、読めない、空、または NO_OPEN_FOLDERS だった場合は、open_folders_prev.txt を読み込みます。
■open_folders_prev.txt が存在し、内容が読み込めて、かつその内容が NO_OPEN_FOLDERS でも空文字列でもない場合は、open_folders_prev.txt の内容でフォルダを開きます。
何らかの原因でopen_folders.txtがおかしくなっている・存在していない場合は、open_folders_prev.txtの内容つまり少し前の状態のフォルダ一覧を開きます。
これは意図しない不具合の予防策です。(※3)
■上記以外の場合は、1つもフォルダは開きません。
※3 Windowsのシャットダウン処理をフックしてopen_folders.txtに記録するのが本来の正確な「ログオン時に以前のフォルダーウィンドウを表示する」になるのですが、頑張ってもうまくできなかったので結局AutoHotkeyでの処理になった次第です。
PythonのコードでWindowsのシャットダウン処理をフックしてopen_folders.txtに記録しようと色々チャレンジした時に何度やっても
- Windowsのシャットダウン処理中にすぐに全てのフォルダが閉じられ、その後にsave_open_folders-30seconds.ahkが実行されて、その後にシャットダウン処理が完了する
という流れとなり、Windowsのシャットダウン処理の最中にopen_folders.txtが空の内容で更新され、結果的に再起動時に1つもフォルダが開きませんでした。
結局これは解決できなかったのでPythonは諦めてAutoHotkey V2でチャレンジすることにして、念のため不具合の予防策として(※3)みたいな処理を含めました。
PC起動後、上記open_folders_prev.txtの実行とは別にsave_open_folders-30seconds.ahkが30秒ごとに処理します。
補足というか例
PCを起動してopen_saved_folders.ahkの実行直後に最初に例えば
- 1.txt
- 2.txt
- 3.txt
を開いている場合は30秒後以内に
■open_folders.txtの内容
- 1.txt
- 2.txt
- 3.txt
■open_folders_prev.txt
まだ作成されない
その後例えばopen_saved_folders.ahkの実行後31秒後に
- 1.txt
- 2.txt
- 3.txt
- 4.txt
を開いた場合は、open_saved_folders.ahkの実行後60秒後に
■open_folders.txt
- 1.txt
- 2.txt
- 3.txt
- 4.txt
■open_folders_prev.txt
- 1.txt
- 2.txt
- 3.txt
となります。
つまりopen_folders_prev.txtは30秒前の状態です。
もしその後開いているフォルダ構成が5分間変わらず、その後(例えば5分1秒後に)変化した場合は
■open_folders.txt
5分30秒後のフォルダ構成
■open_folders_prev.txt
5分前のフォルダ構成
となります。
AutoHotkeyで「ログオン時に以前のフォルダーウィンドウを表示する」をほぼ完璧に解決する手順・説明は以上です。
Windows11、特に24H2は不具合がすごく多い上に、
- Windows Updateをしたら何か1つ解決したけど別の何かが悪化した・できなくなった
ということが頻繁に起こります。。。
SkypeがTeamsに移行するのでTeamsを起動したらちゃんと起動しなくて、仕方なくアンインストール・キャッシュ削除・再インストールして起動したら
問題が発生しました。
Teamsを再起動してみて下さい
と表示されて再起動しても、最小化して起動するだけで正常に起動しない、つまり全く使い物にならないという・・・
Windows11の私の評価はWindows98に近いです><
【おまけ】1つのショートカットで複数のフォルダを一括で開けるJamPack Opener
ちなみにWindowsの通常のショートカットは1つの「.lnk」で1つのリンク先しか開けませんが、JamPack Openerというソフトを使えば1つの「.lnk」で複数のフォルダを一括で開くことが可能です。
Windows11でも問題なく動きます。
ただしJamPack Openerの欠点というか個人的には不要な点が1つあり、5個以上のディレクトリが設定されていると「最小化した状態で開くかどうか」のポップアップが表示されます。
普段パソコン起動時に開きたいフォルダはほとんど同じなので、上記の件がなければこの記事にある「ログオン時に以前のフォルダーウィンドウを表示する」の件をAutoHotkeyで解決しようとはしませんでした。