【AutoIt】ウィンドウの作成|子ウィンドウとメニューリスト – その2

今回は、Autoit ウィンドウの作成~子ウィンドウとメニューリスト~で紹介したウィンドウに様々な機能を追加、コードの解説をしていきます。

目次

サンプルコード

#RequireAdmin
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <File.au3>

If _Singleton("WRCMenu", 1) = 0 Then
    MsgBox(0, "WRCMenu", "既に起動しています")
    Exit
EndIf


Opt("TrayIconHide", 1)
$Gui = GUICreate("WRCMenu", 430, 100, -1, -1, -1, $WS_EX_ACCEPTFILES)
$Input_1 = GUICtrlCreateInput("", 10, 5, 340, 20)
GUICtrlSetState($Input_1, $GUI_DROPACCEPTED)
$Input_2 = GUICtrlCreateInput("", 10, 35, 340, 20)
$btn = GUICtrlCreateButton("開く", 360, 5, 60, 20)
$btn2 = GUICtrlCreateButton("追加", 360, 35, 60, 20)
$btn3 = GUICtrlCreateButton("メニューリスト", 10, 65, 410, 20)
GUISetState()

Dim $szDrive, $szDir, $szFName, $szExt

If IsAdmin() Then
    _ChangeWindowMessageFilterEx($Gui, $WM_DROPFILES, 1)
    _ChangeWindowMessageFilterEx($Gui, $WM_COPYDATA, 1)
    _ChangeWindowMessageFilterEx($Gui, $WM_COPYGLOBALDATA, 1)
EndIf

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            Exit
        Case $msg = $GUI_EVENT_DROPPED
            GUICtrlSetData($Input_1, @GUI_DragFile)
            $FileName = StringRegExp(@GUI_DragFile, ".+\\(.+)", 1)
            GUICtrlSetData($Input_2, $FileName[0])
        Case $msg = $btn
            GUICtrlSetState($btn, $GUI_DISABLE)
            $var = FileOpenDialog("ファイルの選択", @ScriptDir, "実行可能なファイル (*.exe)")
            If Not @error Then
                $arrPath = _PathSplit($var, $szDrive, $szDir, $szFName, $szExt)
                GUICtrlSetData($Input_1, $arrPath[0])
                GUICtrlSetData($Input_2, $arrPath[3] & $arrPath[4])
            Else
                GUICtrlSetData($Input_1, '')
                GUICtrlSetData($Input_2, '')
            EndIf
            GUICtrlSetState($btn, $GUI_ENABLE)
        Case $msg = $btn2
            If GUICtrlRead($Input_2) <> "" Then
                IniWrite(@ScriptDir & "\list.ini", "MyMenu", "FileName", GUICtrlRead($Input_2))
                MsgBox(0, GUICtrlRead($Input_2), "メニューリストに追加しました。")
            EndIf
        Case $msg = $btn3
            $Form1 = GUICreate("メニューリスト", 300, 300, -1, -1, -1, -1, $Gui)
            $ListView1 = GUICtrlCreateListView("追加されているメニュー", 10, 10, 280, 250)
            _GUICtrlListView_SetColumnWidth($ListView1, 0, 280)
            $btn4 = GUICtrlCreateButton("削除", 10, 265, 280, 25)
            GUISetState(@SW_SHOW)
            Dim $read = IniReadSection(@ScriptDir & "\list.ini", "MyMenu")
            If Not @error Then
                GUICtrlCreateListViewItem($read[1][1], $ListView1)
            EndIf
            
            While 1
                $msgg = GUIGetMsg()
                Select
                    Case $msgg = $GUI_EVENT_CLOSE
                        GUIDelete($Form1)
                        ExitLoop
                    Case $msgg = $btn4
                        deltian()
                EndSelect
            WEnd
    EndSelect
WEnd

Func _ChangeWindowMessageFilterEx($hwnd, $iMsg, $iAction)
    Local $aCall = DllCall("user32.dll", "bool", "ChangeWindowMessageFilterEx", _
            "hwnd", $hwnd, _
            "dword", $iMsg, _
            "dword", $iAction, _
            "ptr", 0)
    If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
    Return 1
EndFunc   ;==>_ChangeWindowMessageFilterEx

Func deltian()
    Local $a = _GUICtrlListView_GetSelectedIndices($ListView1)
    Local $b = _GUICtrlListView_GetItemTextString($ListView1, Number($a))
    If Not StringLen($a) Then Return
    Local $chaifen = StringSplit($b, "|")
    If MsgBox(32 + 1, "メニューの削除", "「" & $chaifen[1] & "」を削除してもよろしいですか?") = 1 Then
        _GUICtrlListView_DeleteItemsSelected($ListView1)
        IniDelete(@ScriptDir & "\list.ini", "MyMenu", "FileName")
    EndIf
EndFunc   ;==>deltian

ドラッグ&ドロップしたファイル、またはフォルダーの完全パスを1つ目のInputBoxに、ファイル名またはフォルダー名を2つ目のInputBoxに表示します。

Case $msg = $GUI_EVENT_DROPPED; ドラッグ&ドロップのメッセージを受信します。
GUICtrlSetData($Input_1, @GUI_DragFile); @GUI_DragFileでドラッグ&ドロップされたファイルの完全パスを取得し、1つ目のInputBoxに表示します。
$FileName = StringRegExp(@GUI_DragFile, ".+\(.+)", 1); 正規表現を使い、ファイル名のみを取得します。
GUICtrlSetData($Input_2, $FileName[0]); 2つ目のInputBoxにファイル名を表示します。

開くボタンでファイル選択のダイアログを開き、1つ目のInputBoxにファイルの完全パスを、2つ目のInputBoxにファイル名を表示します。

#include <File.au3>

Dim $szDrive, $szDir, $szFName, $szExt; 変数を宣言します。

Case $msg = $btn; もしも開くボタンが押されたら
GUICtrlSetState($btn, $GUI_DISABLE); 開くボタンを無効化します。
$var = FileOpenDialog("ファイルの選択", @ScriptDir, "実行可能なファイル (*.exe)"); ファイルオープンダイアログを表示します。
If Not @error Then; もしも@errorがFalseならば
$arrPath = _PathSplit($var, $szDrive, $szDir, $szFName, $szExt);

;~ _PathSplit(完全パス,ドライブのパス,フォルダーのパス,ファイル名,拡張子)

;~ 5つのデータの配列を返します。

;~ $arrPath [0] = 完全パス
;~ $arrPath [1] = ドライブのパス
;~ $arrPath [2] = フォルダーのパス
;~ $arrPath [3] = ファイル名
;~ $arrPath [4] = 拡張子


GUICtrlSetData($Input_1, $arrPath[0]); 1つ目のInputBoxに完全パスを表示します。
GUICtrlSetData($Input_2, $arrPath[3] & "." & $arrPath[4]); 2つ目のInputBoxにファイル名と拡張子を表示します。
Else; もしも@errorがTrueならば(ファイルが選択されなかったら)
GUICtrlSetData($Input_1, ""); 1つ目のInputBoxのデータを削除します。
GUICtrlSetData($Input_2, ""); 2つ目のInputBoxのデータを削除します。
EndIf; 条件付き命令文はここまで
GUICtrlSetState($btn, $GUI_ENABLE); 開くボタンを有効化します。

2つ目のInputBoxからファイル名を取得し、追加ボタンでメニューリストにファイル名を追加します。

Case $msg = $btn2; もしも追加ボタンが押されたら

If GUICtrlRead($Input_2) <> "" Then; もしも2つ目のInputBoxが空でないなら
IniWrite(@ScriptDir & "\list.ini", "MyMenu", "FileName", GUICtrlRead($Input_2)); 2つ目のInputBoxの内容をlist.iniファイルに書き込みます。

MsgBox(0, GUICtrlRead($Input_2), "メニューリストに追加しました。"); メッセージボックスを表示します。

EndIf; 条件付き命令文はここまで

;メニューリストウィンドウを表示する GUISetState(@SW_SHOW) の後に次のコードを記述しておきます。

Dim $read = IniReadSection(@ScriptDir & "\list.ini", "MyMenu"); list.iniファイルの中身のデータを読み取ります。

If Not @error Then; 正常にデータが読み取れれば

GUICtrlCreateListViewItem($read[1][1], $ListView1); メニューリストにファイル名を追加します。

EndIf; 条件付き命令文はここまで

list.iniファイルの中身

[MyMenu]
FileName=WRC_64..exe

メニューリストボタンをクリックし、ファイル名が追加されているか確認してみましょう。

追加されているメニュー

削除ボタンでメニューリストにある選択したファイル名を削除します。

Case $msgg = $btn4; もしも削除ボタンが押されたら
deltian(); ユーザー定義関数を実行します。
Func deltian()
    Local $a = _GUICtrlListView_GetSelectedIndices($ListView1)
    Local $b = _GUICtrlListView_GetItemTextString($ListView1, Number($a))
    If Not StringLen($a) Then Return
    Local $chaifen = StringSplit($b, "|")
    If MsgBox(32 + 1, "メニューの削除", "「" & $chaifen[1] & "」を削除してもよろしいですか?") = 1 Then
        _GUICtrlListView_DeleteItemsSelected($ListView1)
        IniDelete(@ScriptDir & "\list.ini", "MyMenu", "FileName")
    EndIf
EndFunc   ;==>deltian

メニューリストのファイル名が選択された状態でないと削除しません。

サンプルコードをコピーして実際に実行し、どのように動作するかを確認してみましょう。

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次