VB6 Windows XPです。
Form_KeyDownでお教えください。
フォームに3個のコマンドボタンを配置していますが、コマンド
ボタンとは関係なくkeyを押しても別の処理を行いたいと思って
います。
でも必ずどこかのコマンドボタンにフォーカスがあって、キーを
押しても、フォーカスのあるボタンが押されたのと同様の処理を
行ってしまします。どのコントロールにもフォーカスしていない
状態ってどうのようにしたら作れるのでしょうか。
・Form のKeyPreviewはTrueにしています。
・全部のコントロールはTabStopをFalseにしています。
よろしくお願いします。
> どのコントロールにもフォーカスしていない
> 状態ってどうのようにしたら作れるのでしょうか。
どこにもフォーカスが無い状態、すなわち、
Private Sub Form_Click()
If Me.ActiveControl Is Nothing Then
MsgBox "フォーカスなし"
End If
End Sub
でメッセージが表示されるような状況というのは、
『フォーカス移動可能なコントロールが無い時』だけです。
(コントロール自体が存在していても、それらすべてが、Visible = False や
Enabled = False などといった状態になっていれば OK)
> ・Form のKeyPreviewはTrueにしています。
KeyPreview を指定しても、一部のキー(矢印キーなど)については、
ボタン系コントロール(CommandButton, CheckBox等)にフォーカスが
ある状態では、KeyDown イベントが発生しない仕様です。
(サブクラス化して、キー押下を判定する事は可能ですけれども)
> ・全部のコントロールはTabStopをFalseにしています。
TabStop は、Tabキーでの移動を制限するだけであって、
マウスクリック操作や SetFocusメソッドなどによるフォーカス移動を
制限するわけではありません。
こういうことかな?
Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer)
Call Form_KeyDown(KeyCode, Shift)
KeyCode = 0
Shift = 0
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'//KeyDown処理
End Sub
こちらにも目を通しておくといいでしょう。
http://madia.world.coocan.jp/vb/vb_bbs2/200305_03050048.html
魔界の仮面弁士さま、犬ひろしさまご指導ありがとうございました。
Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer)
Call Form_KeyDown(KeyCode, Shift)
KeyCode = 0
Shift = 0
End Sub
理解できました。解決です。すべてのCommand Controlについてすべて記
述するのがかなり手間でしたが・・・・。
自分なりに挑戦してたやりかたも記述しておきます。(邪道でしょうけど)
コンボボックスもフォーム内にありますので、常にフォーカスがコンボボ
ックスにあたるようMe.Combo1.SetFocusをそこら中に書きまくるってやり
かたです。フォーカスがコンボボックスにあるときはForm_KeyDownが支障
なく機能してくれます。
解決チェック忘れてました。
| ツイート |
|