サンプルコード

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

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

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

コメント