ヘッダー
Visual Basic サンプル集
VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

ScrollLock を判定する

2024/4/13

→ C# のサンプルに切り替える → Python のサンプルに切り替える

 

Windowsフォームアプリで ScrollLock を判定する

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

If Control.IsKeyLocked(Keys.Scroll) Then
    MessageBox.Show("ScrollLockされています。")
Else
    MessageBox.Show("ScrollLockされていません。")
End If

 

これでもできます。

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

If My.Computer.Keyboard.ScrollLock Then
    MessageBox.Show("ScrollLockされています。")
Else
    MessageBox.Show("ScrollLockされていません。")
End If

 

WPF で ScrollLock を判定する

VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

If Keyboard.IsKeyToggled(Key.ScrollLock) Then
    MessageBox.Show("ScrollLockされています。")
Else
    MessageBox.Show("ScrollLockされていません。")
End If

 

 

汎用的に ScrollLock を判定する

まず、次のように KeyboardUtilクラスを記述します。

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Public Class KeyboardUtil
    <System.Runtime.InteropServices.DllImport("User32.dll")>
    Private Shared Function GetKeyState(keyCode As Integer) As Short
        'この中には何も記述しません。
    End Function


    '''<summary>
    '''キーボードのScrollLockがロック状態を取得します。ロックされている場合 True を返します。
    '''</summary>
    Public Shared Function IsScrollLock() As Boolean
        '145はScrollLockキーを表します。
        If (GetKeyState(145) And &H8001) <> 0 Then
            Return True 'ScrollLockされています。
        Else
            Return False 'ScrollLockされていません。
        End If
    End Function
End Class

そして、呼び出したい個所で次のように呼び出します。

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

If KeyboardUtil.IsScrollLock() Then
    Debug.WriteLine("ScrollLockされています。")
Else
    Debug.WriteLine("ScrollLockされていません。")
End If

Debug.WriteLineが表示される場所

メモ:この例はWindowsでのみ動作します。Linuxなどで実行すると System.DllNotFoundException の例外が発生します。

メモ:&H8001の根拠はSystem.Windows.Forms.Control.IsKeyLockedの実装。私は上位ビットの意味を理解していません。

 

 

参考:ロックキーの状態を取得する方法の比較

方法 Consoleクラス Controlクラス
(Windows
フォーム)
My.Computer
.Keyboardクラス
Keyboardクラス
(WPF)
WindowsAPIの
GetKeyState
  使用例 使用例 使用例 使用例 使用例
判定できるキー
NumLock
CapsLock
ScrollLock ×
Insert × ×
使用できるアプリケーションの種類
コンソール × × ×
Windowsフォーム ×
WPF × ×
クラスライブラリ × × ×
使用できるOS
Windows
Windows以外 × × × × ×

どのような場合でも推奨できる手段の決め手がない状況です。やりたいことによって手段を決定しましょう。

ヒント

  • Windowsフォームに限定するなら、My.Computer.KeyboardクラスはAlt・Shift・Ctrlの判定やキーストロークの送信機能も含んでいるうえ、簡単に使用できるのでとても便利です。
  • コンソールやクラスライブラリでも、WindowsフォームやWPFを使用できるようにフレームワークを構成すればControlクラスやKeyboardクラスを呼び出せます。→ その方法の例
  • WindowsAPIのGetKeyStateは最も汎用性が高い方法ですが、記述量が多いので手軽さがありません。自作のクラスを作って機能を簡単に呼び出せるようにしておけば便利に使用できます。
  • Windows以外のOSでキーを判定する方法は不明です。

 


English