今回は、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
メニューリストのファイル名が選択された状態でないと削除しません。
サンプルコードをコピーして実際に実行し、どのように動作するかを確認してみましょう。
コメント