Autoit|「システムのプロパティ」を模倣してみた

今回は、Windows のシステムのプロパティを模倣してみましたので紹介したいと思います。

模倣しているのは一部ですが、ここで学べるのは次の項目です。

  1. ウィンドウの右上の最小化ボタンと最大化ボタンを非表示し、閉じるボタンのみにすること。
  2. ウィンドウの左上のアイコンを消す方法。
  3. ショートカットキーの設定
  4. OKボタンに常にフォーカスを合わせておくこと。
  5. タブのテキストをセンターに配置する。
  6. インプットボックス内のデータの変化に対する通知メッセージの取得。
目次

サンプルコード

左が模倣、右がシステムのプロパティ – 画像クリックで拡大

サンプルコードの解説

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include-once

Global Const $EN_CHANGE = 0x0300

$Gui = GUICreate(" システムのプロパティ" & @CRLF, 545, 670, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION), $WS_EX_DLGMODALFRAME)
_WinAPI_DestroyIcon(_WinAPI_GetClassLongEx($Gui, $GCL_HICON))
_WinAPI_SetClassLongEx($Gui, $GCL_HICON, 0)
_WinAPI_SetClassLongEx($Gui, $GCL_HICONSM, 0)
GUISetFont(9, 0, 0, "Yu Gothic UI")

; -------------------------------ボタン開始
$OK = GUICtrlCreateButton("OK", 218, 625, 100, 35, $BS_DEFPUSHBUTTON)
GUICtrlSetState(-1, $GUI_FOCUS)
$Cancel = GUICtrlCreateButton("キャンセル", 328, 625, 100, 35)
$Tekiyou = GUICtrlCreateButton("適用(&A)", 438, 625, 100, 35)
GUICtrlSetState(-1, $GUI_DISABLE)
; ------------------------------ボタン終了


; --------------------------------TAB開始
GUICtrlCreateTab(7, 10, 532, 604)
GUICtrlSendMsg(-1, $TCM_SETMINTABWIDTH, 0, 0); タブのテキスト配置をセンターにする

$TabComputer = GUICtrlCreateTabItem("コンピューター名")
GUICtrlCreateIcon("shell32.dll", 16, 25, 60, 40, 40)
GUICtrlCreateLabel("次の情報は、このコンピューターをネットワーク上で識別するために使われます。", 91, 65, 410, 50)
GUICtrlCreateLabel("コンピューターの説明(D):", 25, 140, 170, 25)
$ComputerInput = GUICtrlCreateInput("", 195, 135, 305, 30)
GUICtrlSetState($ComputerInput, $GUI_FOCUS)
GUICtrlCreateLabel('例: "キッチンのコンピューター"、"仕事用コンピューター"', 195, 175, 305, 25)

GUICtrlCreateLabel("フル コンピューター名:", 25, 220, 170, 25)
GUICtrlCreateLabel("ワークグループ:", 25, 260, 170, 25)
GUICtrlCreateLabel("UserName", 195, 220, 170, 25)
GUICtrlCreateLabel("WORKGROUP", 195, 260, 170, 25)

GUICtrlCreateLabel("ドメインまたはワークグループに参加するためのウィザードを" & _
        "使用するには [ネットワーク ID] をクリックしてください。", 25, 310, 336, 50)
GUICtrlCreateLabel("コンピューター名を変更したりドメインに参加したりするには" & _
" [変更] をクリックしてください。", 25, 390, 336, 50)

$Nid = GUICtrlCreateButton("ネットワーク ID(&N)...", 375, 310, 130, 35)
$Change = GUICtrlCreateButton("変更(&C)...", 375, 390, 130, 35)

GUICtrlCreateTabItem("ハードウェア")

GUICtrlCreateTabItem("詳細設定")

GUICtrlCreateTabItem("システムの保護")

GUICtrlCreateTabItem("リモート")

GUICtrlCreateTabItem("")
; --------------------------------TAB終了

GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $OK
            MsgBox(0, "", "OKをクリックしました", 0, $Gui)
            Exit
        Case $Cancel
            MsgBox(0, "", "キャンセルをクリックしました", 0, $Gui)
            Exit
        Case $Nid
            MsgBox(0, "", "「ネットワーク ID(&N)...」をクリックしました", 0, $Gui)
        Case $Change
            MsgBox(0, "", "「変更(&C)...」をクリックしました", 0, $Gui)
        Case $Tekiyou
            GUICtrlSetState($Tekiyou, $GUI_DISABLE)
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $Msg, $wParam, $ilParam)
    Switch BitAND(0xffff, $wParam)
        Case $ComputerInput
            If BitShift($wParam, 16) = $EN_CHANGE Then
                GUICtrlSetState($Tekiyou, $GUI_ENABLE)
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

コードの説明

#include-once

同じファイルを何度もインクルードしないために指定します。

Global Const $EN_CHANGE = 0x0300

グローバル変数の宣言をします。

$EN_CHANGE = 0x0300 は、内容が変更された場合のメッセージコードです。

$Gui = GUICreate(” システムのプロパティ” & @CRLF, 545, 698, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION), $WS_EX_DLGMODALFRAME)

$WS_SYSMENU = タイトルバーにウィンドウメニューを持つウィンドウを作成します。

$WS_CAPTION = タイトルバーを持つウィンドウを作成します。

スタイルを組み合わせるには BitOr($GUI_SS_DEFAULT_GUI, newstyle,…)というように書きます。

$WS_EX_DLGMODALFRAME = 二重のボーダーを持つウィンドウを作成します。

拡張スタイル $WS_EX_DLGMODALFRAME を指定することでウィンドウ左上のアイコンに変化を加えることができるようになります。

_WinAPI_DestroyIcon(_WinAPI_GetClassLongEx($Gui, $GCL_HICON))

_WinAPI_DestroyIcon = アイコンを破壊し、アイコンが占めていたメモリを解放します。

_WinAPI_GetClassLongEx = 指定されたウィンドウの指定された値を置き換えます。

$GCL_HICON = クラスに関連付けられているアイコンハンドルを取得します。

_WinAPI_SetClassLongEx($Gui, $GCL_HICON, 0)

取得したアイコンハンドルを「0」に置き換えます。

$GCL_HICONSM = クラスに関連付けられている小さなアイコンハンドルを取得します。

取得した小さなアイコンハンドルを「0」に置き換えます。

これでウィンドウ左上のアイコンが消えます。

GUISetFont(9, 0, 0, “Yu Gothic UI”)

ウィンドウ内で使用するフォントを指定します。

$OK = GUICtrlCreateButton(“OK”, 218, 625, 100, 35, $BS_DEFPUSHBUTTON)

$BS_DEFPUSHBUTTON を指定することで、キーボードの Enter を押した時にフォーカスが合っていなくても OK ボタンが押されるようになります。

$Tekiyou = GUICtrlCreateButton(“適用(&A)”, 438, 625, 100, 35)

文字列に「A」ではなく「&A」のように書いておくと、ショートカットキー「Alt+a」を押した時に、このコントロール ID が押されるようになります。

GUICtrlSetState(-1, $GUI_DISABLE)

適用ボタンを無効にしておきます。

GUICtrlCreateTab(7, 10, 532, 604)
GUICtrlSendMsg(-1, $TCM_SETMINTABWIDTH, 0, 0)

メッセージ $TCM_SETMINTABWIDTH をタブに送信することで、タブのテキストがセンターに配置されます。

GUICtrlCreateIcon(“shell32.dll”, 16, 25, 60, 40, 40)

アイコンコントロールを作成します。

「16」がアイコンの名前(番号)です。

shell32.dll は Windows の DLL ファイル(ダイナミックリンクライブラリ)であり、この DLL からアイコンを呼び出します。

shell32.dll のアイコンを調べるには、何でもいいのでフォルダーを右クリックし、「プロパティ」をクリックします。

下の方に「アイコンの変更」ボタンがありますのでクリックします。
すると次の画面が表示されますので、左上が「1」番になります。

$ComputerInput = GUICtrlCreateInput(“”, 220, 135, 280, 30)
GUICtrlSetState($ComputerInput, $GUI_FOCUS)

インプットボックスにフォーカスを合わせておきます。

GUICtrlSetState(-1, $GUI_FOCUS) と書いても構いません。

「-1」とは、1つ前のコントロール ID を意味しますので、インプットボックスを作成したすぐ後に GUICtrlSetState(-1, $GUI_FOCUS) と書けば「-1」はインプットボックスのコントロール ID になります。

GUIRegisterMsg($WM_COMMAND, “WM_COMMAND”)

Windowsメッセージに対してユーザー定義関数を登録します。

WM_COMMAND は、メニューアイテムの選択やコントロールからの通知を取得します。

Case $Tekiyou
GUICtrlSetState($Tekiyou, $GUI_DISABLE)

「適用」ボタンが押されたらボタンを無効にします。

Func WM_COMMAND($hWnd, $Msg, $wParam, $ilParam)
Switch BitAND(0xffff, $wParam)
Case $ComputerInput
If BitShift($wParam, 16) = $EN_CHANGE Then
GUICtrlSetState($Tekiyou, $GUI_ENABLE)
EndIf
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND

インプットボックスの通知メッセージを取得します。

If BitShift($wParam, 16) = $EN_CHANGE Then

もしもインプットボックスに変化があったなら
GUICtrlSetState($Tekiyou, $GUI_ENABLE)

「適用」ボタンを有効にします。
EndIf

注意事項

While…WEnd などのループの中にインプットボックスの変化を監視するコードを入れることはできますが、ループの中に何かを判別するようなコードを入れるとプログラムの反応が遅くなります。

できるだけループの中に入れずに、ウィンドウメッセージを利用することをおすすめします。

このサンプルは様々なツールに応用することができますので、是非覚えてください。

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

この記事を書いた人

当サイトでは、Windows用のプログラミング言語「Autoit」で簡単なツールを作成するためのサンプルコード、応用方法を紹介しています。

コメント

コメントする


目次