Shift+クリックやCtrl+クリックを判別する


コマンドボタンが、Shiftキーを押しながらクリックされたかどうかの判別は、標準の「CommandButton_Click」ではできません。左ボタンと右ボタンを判別したように、MouseDownイベントかMouseUpイベントを使います。ここでは、MouseUpイベントでやりましょう。

Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _
                                                            ByVal X As Single, ByVal Y As Single)
End Sub

コマンドボタンがクリックされたとき、Sfhitキー・Ctrlキー・Altキーのいずれかが押されていたかどうかは、引数Shiftに数値が格納されます。

内容
1 Shiftキーが押されました
2 Ctrlキーが押されました
3 Shiftキーと同時にCtrlキーが押されました
4 Altキーが押されました
5 Altキーと同時にShiftキーが押されました
6 Altキーと同時にCtrlキーが押されました
7 Altキー、Shiftキー、Ctrlキーの3つが同時に押されました

なので、これを区別すれば、どのキーが押されていたかを判別できます。

Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _
                                                            ByVal X As Single, ByVal Y As Single)
    If Shift = 7 Then
        MsgBox "隠し機能"
    Else
        MsgBox "通常機能"
    End If
End Sub

Shift+Ctrl+Altを押しながら右クリックされたときだけ、管理者用の機能を実行するなどに便利です。

隠し機能的な話をしたので、ついでにもう少し。利用者には使って欲しくないけど、管理者がデバッグなどの目的で実行したいような機能は、上のように特別な方法で起動させるといいです。Shift+Ctrl+Alt+右クリックあたりは、まず普通のユーザーが普通に使うときは、誤って操作することもないでしょう。しかし、ものすごく好奇心の旺盛なユーザーだったり、信じられない"ウッカリ者"のユーザーだったら、つい間違えて実行してしまうかもしれません。そんなときは、次のようにする手もあります。

次のコードは、コマンドボタンを普通に左クリックしたときには"通常機能"と表示しますが、Shift+Ctrl+Altを押しながら、右ボタンで5回続けてクリックしたときだけ、パスワードの入力画面を表示します。

Private Sub CommandButton1_Click()
    MsgBox "通常機能"
End Sub
Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _
                                                            ByVal X As Single, ByVal Y As Single)
    Static cnt As Long
    If Shift = 7 And Button = 2 Then cnt = cnt + 1
    If cnt = 5 Then
        If InputBox("Password?") = "1234" Then
            MsgBox "管理者機能"
        End If
    End If
End Sub

Staticステートメントによる静的変数は、プロシージャが終了してもクリアされません。