とりあえず、画面のロック前後で、FocusManager のキーアクセルを、引きはがし&再設定して、
キープレスイベントを空振りさせることはできそうです。
もっと良い方法はないものですかね・・・。
Code:
||画面をロックするためにバリアを張るフレーム
{define-class public BarrierFrame {inherits OverlayBox}
{constructor public {default ...}
{construct-super {splice ...}}
}
field barrier-screen-frame:Graphic =
{Fill background = "transparent"}
field private _barrier?:bool = false
{getter public {barrier?}:bool
{return self._barrier?}
}
{setter public {barrier? val:bool}:void
set self._barrier? = val
{if self._barrier? then
{self.add self.barrier-screen-frame}
else
{dispatch-events false}
{self.barrier-screen-frame.detach}
}
}
}
{def bf = {BarrierFrame}}
{def td = {TextField}}
||FocusManager に設定するアクセルキーを管理する配列変数
{def ary-key-accels = {{Array-of KeyAccel}}}
{def lock-cb =
{CommandButton
label = "画面のロック",
{on Action at cb:CommandButton do
set td.value = "ロック中"
def fm = {cb.get-focus-manager}
||ロック中のキー押下イベントが流れてしまわないように、
||フォーカスマネージャからキーアクセルを引きはがす
{dispatch-events false}
{for e in ary-key-accels do
{fm.remove-key-accel e}
}
{dispatch-events false}
set bf.barrier? = true
{read-from {url "http://www.yahoo.com"}}
set bf.barrier? = false
set td.value = ""
||フォーカスマネージャのキーアクセルをもとに戻す
{dispatch-events false}
{for e in ary-key-accels do
{fm.add-key-accel e}
}
{dispatch-events false}
set td.value = ""
}
}
}
{def fnc-cb =
{CommandButton
label = "メッセージ表示(F1)",
{on Action do
{popup-message "hello world"}
} ,
||画面表示時にFocusManager に、アクセルキーを設定
{on AttachEvent at button:CommandButton do
def fm = {button.get-focus-manager}
set fm.standard-accelerators? = false
def key-accel-string = "F1"
def key-accel = {KeyAccel key-accel-string = key-accel-string,
{on Action do
{button.take-action}
}
}
{fm.add-key-accel key-accel}
||アクセルキーを管理配列に追加
{ary-key-accels.append key-accel}
}
}
}
{do
{bf.add {VBox td, lock-cb, fnc-cb } }
def d:Dialog = {Dialog bf}
{d.show}
}