サンプルコード

Win11 でフォトビューアーを使えるようにするツールのサンプルコード

今回紹介するのは、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[, オプション] )

パラメータ:

パラメータ

コントロール IDGUICtrlCreate…関数によって返されるコントロール識別子(コントロールID)。
オプション[オプション] コントロールの拡張情報を返すかどうか。
0 = (デフォルト) コントロールの状態またはデータを表す値を返します。
1 = コントロールの拡張情報を返します(注意を参照)。

GUICtrlRead($Checkbox1, 1) オプションで「1」を指定していますので、コントロールの拡張情報を返します。

ということは、コントロールの状態やデータを返すのではなく、コントロールに表示されている名前が返されます

コメント