トップへ戻る

Autoitプログラミング

ウィンドウの作成

タイトルのみのウィンドウを作成します。

 

 

Global Const $GUI_EVENT_CLOSE = -3 ; ウィンドウを閉じるイベントの値

 

GUICreate(" タイトル ") ; ディスプレイの中央にGUI  ウィンドウを作成します。

 

GUISetState(@SW_SHOW) ; GUI ウィンドウを表示します。

 

 

While 1

 

    $msg = GUIGetMsg() ; ウィンドウ上で起こっているイベントを取得します。

 

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop ; ウィンドウの閉じるボタンが押されたら ExitLoop で While ループを抜けます。

 

WEnd

 

GUIDelete() ; GUI ウィンドウを削除します。

 

 

 

 

ExitLoop は、ループ(While 、Do 、For)を抜けるためのキーワードです。

 

ウィンドウ上には普段使っているWindowsの各ウィンドウのように、コントロール(ボタン、インプットボックス等...)を作成することができます。

 

ユーザーがウィンドウに対して何かをするたびにイベントが発生します。

 

これらのイベントは、ループまたはイベントモードで取得し、取得されたイベントに対してどのような動作をするかをプログラミングしていきます。

ウィンドウメッセージ

まず次のコードを見てみましょう。

 

Global Const $GUI_EVENT_CLOSE = -3

 

GUICreate(" ウィンドウ ")
$Input = GUICtrlCreateInput("1111", 10, 35, 300, 20)
$btn = GUICtrlCreateButton(" インプットボックスの値を取得 ", 40, 75, 200, 20)

 

GUISetState(@SW_SHOW)

 

While 1
    $msg = GUIGetMsg()

 

    Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $btn
            $D = GUICtrlRead($Input)
            MsgBox(0, "", " インプットボックスの値: " & $D)
    EndSelect

 

WEnd

 

GUIDelete()

 

 

 

 

 

メッセージループモード

 

無限ループの中で常にウィンドウに対して起こっているイベント情報をチェックしています。

 

上記のコードは、ウィンドウを閉じるイベントが発生した場合、ループを抜け、ボタン($btn)が押された場合、GUICtrlRead 関数でインプットボックス内のデータを読み取り、メッセージボックスを表示するというコードです。

 

欠点:

 

無限ループの中で常にウィンドウに対して起こっているイベント情報をチェックしているため、

 

たくさんのリソースを消費し、何かほかの処理をしたい場合にも不便です。

 

メッセージループモードでは、プログラムの反応を遅くします。

 

イベントモード

 

次にイベントモードを見てみましょう。

 

Global Const $GUI_EVENT_CLOSE = -3

 

 

Opt("GUIOnEventMode", 1)

 

GUICreate(" ウィンドウ ")

 

GUISetOnEvent($GUI_EVENT_CLOSE, "main")

 

$Input = GUICtrlCreateInput("1111", 10, 35, 300, 20)
$btn = GUICtrlCreateButton("インプットボックスの値を取得", 40, 75, 200, 20)

 

GUICtrlSetOnEvent($btn, "main")
GUISetState(@SW_SHOW)

 

 

While 1
    GUISetBkColor(RandomColor())
    Sleep(3000)
WEnd

 

Func main()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
        Case $btn
            $D = GUICtrlRead($Input)
            MsgBox(0, " インプットボックスの値: ", $D)
    EndSwitch

 

EndFunc   ;==>main

 

Func RandomColor()
    Return "0x" & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2)
EndFunc   ;==>RandomColor

 

 

 

 

 

イベントモードを使用するには、Opt("GUIOnEventMode", 1) を追加する必要があります。

 

さらに GUISetOnEvent 関数でシステムボタンがクリックされた際に呼ばれるユーザー定義関数を定義します。

 

main()関数を見てみましょう。

 

マクロ @GUI_CtrlId は、最後にクリックしたGUI コントロールのIDです。(イベント関数でのみ有効)

 

上記のコードを見るとわかるように、イベントモードでは、ウィンドウにイベントが起きた時のみに

 

イベントに対しての処理を行っています。

 

メッセージループモードとは違い、常にイベント情報をチェックしているわけではないので、無駄なリソースを消費しません。

 

さらに、無限ループ内で別の処理ができ、イベントに対しての遅延も発生しないのがイベントモードの良い所です。

 

※メッセージループモードでメインループ内にSleep 3秒 を入れた場合、ウィンドウメッセージは遅延されるか、または応答しません。

 

ウィンドウを作成する際は、イベントモードの使用をおすすめします。

メッセージの阻止

AutoIt の関数 GUIRegisterMsg は、既知のWindowsメッセージID(WM_MSG)に対してユーザー定義関数を登録します。

 

まず次のコードをご覧ください。

 

 

Global Const $GUI_EVENT_CLOSE = -3
Global Const $WM_ENTERSIZEMOVE = 0x0231 ; ウィンドウが移動またはサイズ変更した
Global Const $WM_EXITSIZEMOVE = 0x0232 ; ウィンドウの移動・サイズ変更の処理が終了したとき

 

Opt("GUIOnEventMode", 1) ; OnEvent関数を登録

 

$Gui = GUICreate(" ウィンドウ ") ;ウィンドウの作成

 

GUISetOnEvent($GUI_EVENT_CLOSE, "main") ; システムボタンがクリックされた際に呼ばれるユーザー定義関数を定義

 

$Input = GUICtrlCreateInput("1111", 10, 35, 300, 20)
$btn = GUICtrlCreateButton(" インプットボックスの値を取得 ", 40, 75, 200, 20)

 

;コントロールがクリックされたときに呼ばれるユーザー定義関数を定義します。
GUICtrlSetOnEvent($btn, "main")

 

GUISetState(@SW_SHOW) ; ウィンドウを表示

 

; ウィンドウが移動またはサイズ変更したときのWindowsメッセージIDに対してユーザー定義関数を登録
GUIRegisterMsg($WM_ENTERSIZEMOVE, "WM_ENTERSIZEMOVE")

 

; ウィンドウの移動・サイズ変更の処理が終了したときのWindowsメッセージIDに対してユーザー定義関数を登録
GUIRegisterMsg($WM_EXITSIZEMOVE, "WM_EXITSIZEMOVE")

 

 

While 1 ; 無限ループ
    GUISetBkColor(RandomColor()) ; ウィンドウの背景色を変更
    Sleep(3000) ; スリープ 3秒
WEnd

 

 

Func main()
    Switch @GUI_CtrlId ; 最後にクリックしたGUI コントロールのID
        Case $GUI_EVENT_CLOSE
            Exit
        Case $btn
            $D = GUICtrlRead($Input) ; インプットボックスのデータを読み取る
            MsgBox(0, " インプットボックスの値: ", $D)
    EndSwitch

 

EndFunc   ;==>main

 

Func RandomColor()
    Return "0x" & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2)
EndFunc   ;==>RandomColor

 

Func WM_ENTERSIZEMOVE($hWndGUI, $MsgID, $WParam, $LParam)
    WinSetTrans($Gui, "", 130)
EndFunc   ;==>WM_ENTERSIZEMOVE

 

Func WM_EXITSIZEMOVE($hWndGUI, $MsgID, $WParam, $LParam)
    WinSetTrans($Gui, "", 255)
EndFunc   ;==>WM_EXITSIZEMOVE

 

 

 

 

 

上記のコードを実行し、ウィンドウを移動してみましょう。

 

ウィンドウが半透明になるのがわかると思います。

 

これは、ウィンドウの移動イベントが発生した際に、スクリプトがウィンドウの移動メッセージを阻止したため、

 

WinSetTrans($Gui, "", 130) が実行され、ウィンドウが半透明に設定されているのです。

 

ウィンドウの移動以外にも、ダブルクリックやシングルクリック、コンボボックスコントロールのクリック等のイベントも阻止することができます。

親ウィンドウと子ウィンドウ

AutoIt の GUICreate 関数には、ヘルプファイルを見てわかるように、八つのパラメータがあります。

 

一番最後が親ウィンドウと子ウィンドウに関してのパラメータになります。

 

事前に作成された別のウィンドウのハンドルを指定すれば、新しいウィンドウはその子ウィンドウになります。

 

例えばウィンドウのクローズボタン等を表示させたくない場合、スタイルを指定します。

 

6番目と7番目のパラメータでスタイルを指定できます。

 

デフォルトにしたい場合は、6番目と7番目のパラメータに -1 を指定します。

 

ウィンドウの作成に成功した場合、GUICreate 関数はウィンドウハンドルを返します。

 

 

Global Const $GUI_EVENT_CLOSE = -3

 

Dim $Child_Gui

 

Opt("GUIOnEventMode", 1)

 

$Gui = GUICreate(" ウィンドウ ")
GUISetOnEvent($GUI_EVENT_CLOSE, "main") ; システムボタンがクリックされた際に呼ばれるユーザー定義関数を定義

 

$Input = GUICtrlCreateInput("1111", 10, 35, 300, 20)

 

$btn = GUICtrlCreateButton(" インプットボックスの値を取得 ", 40, 75, 200, 20)

 

;コントロールがクリックされたときに呼ばれるユーザー定義関数を定義します。
GUICtrlSetOnEvent($btn, "main")

 

$Show_btn = GUICtrlCreateButton(" 子ウィンドウの表示 ", 40, 100, 200, 20)

 

;コントロールがクリックされたときに呼ばれるユーザー定義関数を定義します。
GUICtrlSetOnEvent($Show_btn, "main")

 

GUISetState(@SW_SHOW)

 

 

While 1
    GUISetBkColor(RandomColor())
    Sleep(1000)
WEnd

 

Func main()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Switch @GUI_WinHandle; 最後にクリックされたGUI ウィンドウのハンドル。イベント関数でのみ有効。
                Case $Gui
                    Exit
                Case $Child_Gui
                    GUIDelete($Child_Gui)
            EndSwitch

 

        Case $btn
            $D = GUICtrlRead($Input); インプットボックスのデータを読み取る
            MsgBox(0, " インプットボックスの値: ", $D)
        Case $Show_btn
            Child_Gui()
    EndSwitch

 

EndFunc   ;==>main

 

Func RandomColor()
    Return "0x" & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2)
EndFunc   ;==>RandomColor

 

Func Child_Gui()
    $Child_Gui = GUICreate(" 子ウィンドウ ", 200, 40, -1, -1, -1, -1, $Gui)
    GUISetOnEvent($GUI_EVENT_CLOSE, "main")
    GUISetState(@SW_SHOW)
EndFunc   ;==>Child_Gui

 

 

 

 

気付いた方もいると思いますが、Switch文の中にもう1つSwitch文が入っています。

 

これを入れ子構造と呼びます。

 

子ウィンドウが表示されていないときは親ウィンドウの背景色が常に変更され、

 

子ウィンドウの表示中は子ウィンドウの出現により、最後にクリックされたGUI ウィンドウのハンドルが

 

子ウィンドウのハンドルになるため、親ウィンドウの背景色は変更されなくなり、子ウィンドウの背景色が常に変更されるようになります。