今回紹介するのは、Windows 11 で Windows フォトビューアーを使えるようにする方法、ツール で紹介したツールのサンプルコードです。
このツールは Windows 11 のみに対応しています。
Windows 11 以外の OS には対応していませんのでご注意ください。
サンプルコード
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile_x64=フォトビューア復活ツール.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include-once
Opt("TrayIconHide", 1)
; Windows 11 のみに対応
If @OSVersion <> "WIN_11" Then Exit (MsgBox(16, "エラー", "お使いの OS には対応していません。"))
; 高DPI に対応
DllCall("User32.dll", "bool", "SetProcessDpiAwarenessContext", "HWND", "DPI_AWARENESS_CONTEXT" - 2)
$RegKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations"
$Form1 = GUICreate(" フォトビューア復活ツール", 480, 266, 316, 217)
$Button1 = GUICtrlCreateButton("選択項目を復活", 184, 112, 281, 65)
$Button2 = GUICtrlCreateButton("選択項目を削除", 184, 184, 281, 65)
$Group1 = GUICtrlCreateGroup("選択", 16, 104, 161, 145)
$Checkbox1 = GUICtrlCreateCheckbox(".jpg", 40, 128)
$Checkbox2 = GUICtrlCreateCheckbox(".bmp", 40, 160)
$Checkbox3 = GUICtrlCreateCheckbox(".png", 40, 192)
$Checkbox4 = GUICtrlCreateCheckbox(".gif", 40, 224)
$Checkbox5 = GUICtrlCreateCheckbox(".jpeg", 110, 128)
$SelectAll = GUICtrlCreateCheckbox("ALL", 110, 224)
Dim $Extension[5]; 各チェックボックスに表示されている文字を配列に代入
For $i = 0 To UBound($Extension) - 1
$Extension[$i] = GUICtrlRead(Eval("Checkbox" & $i + 1), 1)
Next
GUICtrlCreateGroup("", 99, 99, 1, 1)
$Label1 = GUICtrlCreateLabel("このツールは、Windows フォトビューアを復活させるツールです。 " & @CRLF & @CRLF & _
"項目にチェックを入れ、ボタンをクリックしてください。", 16, 16, 445, 83)
GUICtrlSetFont(-1, 10)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1; 選択項目を復活
RegWD($Extension)
Case $Button2; 選択項目を削除
RegWD($Extension, 1)
Case $SelectAll
If _IsChecked($SelectAll) Then
SelectAll($GUI_CHECKED); すべて選択
Else
SelectAll($GUI_UNCHECKED); すべて選択解除
EndIf
EndSwitch
WEnd
Func SelectAll($All = $GUI_CHECKED)
For $i = 1 To UBound($Extension)
GUICtrlSetState(Eval("Checkbox" & $i), $All)
Next
EndFunc ;==>SelectAll
Func RegWD($Ext, $Del = 0)
Local $Checked = 0, $txt[2] = ["選択項目を復活しました。", "選択項目を削除しました。"]
For $i = 1 To UBound($Ext)
If _IsChecked(Eval("Checkbox" & $i)) Then; チェックボックスがチェックされていれば
$Checked = 1
If $Del Then; フラグが 1 なら
RegDelete($RegKey, $Ext[$i - 1]); レジストリキーの削除
Else; フラグが 0 なら
; レジストリキーの追加
RegWrite($RegKey, $Ext[$i - 1], "REG_SZ", "PhotoViewer.FileAssoc.Tiff")
EndIf
EndIf
Next
If $Checked Then MsgBox(0, "設定", $txt[$Del], 0, $Form1)
EndFunc ;==>RegWD
Func _IsChecked($iControlID); チェックボックスがチェックされているかを確認
Return BitAND(GUICtrlRead($iControlID), $GUI_CHECKED) = $GUI_CHECKED
EndFunc ;==>_IsChecked
実行すると次のようになります。
コードの解説
ここでは各チェックボックスに表示されている文字を配列に代入するコードについて説明します。
Dim $Extension[5]
Dim $Extension[5] で5つの配列を作成します。
For $i = 0 To UBound($Extension) - 1
$Extension[$i] = GUICtrlRead(Eval("Checkbox" & $i + 1), 1)
Next
まず Eval(“Checkbox” & $i + 1) から説明します。
Eval
文字列によって定義される変数の値を返します。
形式:Eval ( string )
パラメーター:文字列(変数の名前を表す文字)
少しわかりにくいかもしれませんが、簡単に言うと、文字列で記述した既にある変数名を、実際の変数として扱うことが出来るということです。
変数 $Checkbox1 ~ $Checkbox5 は既に宣言されています。
条件付きループ の中で、最初のループ中の変数 $i の値は「0」です。
ということは、Eval(“Checkbox” & $i + 1) = Eval(“Checkbox” & 0 + 1) = 変数 $Checkbox1 となりますね。
$Extension[0] には GUICtrlRead($Checkbox1, 1) が代入されます。
$Extension[1] には GUICtrlRead($Checkbox2, 1) が代入されます。
$Extension[2] には GUICtrlRead($Checkbox3, 1) が代入されます。
$Extension[3] には GUICtrlRead($Checkbox4, 1) が代入されます。
$Extension[4] には GUICtrlRead($Checkbox5, 1) が代入されます。
GUICtrlRead
コントロールの状態またはデータを読み取ります。
形式:GUICtrlRead (コントロール ID[, オプション] )
パラメータ:
パラメータ
コントロール ID | GUICtrlCreate…関数によって返されるコントロール識別子(コントロールID)。 |
オプション | [オプション] コントロールの拡張情報を返すかどうか。 0 = (デフォルト) コントロールの状態またはデータを表す値を返します。 1 = コントロールの拡張情報を返します(注意を参照)。 |
GUICtrlRead($Checkbox1, 1) オプションで「1」を指定していますので、コントロールの拡張情報を返します。
ということは、コントロールの状態やデータを返すのではなく、コントロールに表示されている名前が返されます。
コメント