NumLock等の変更

タグの編集
投稿者 まだまだ  (高校生) 投稿日時 2011/3/27 22:04:26
こんにちは、いつもお世話になっております。

さて質問ですが、今キーボードのLumLock、CapsLock、ScrollLockの状態を
プログラムから変更させたいなと思っています。
検索してもそのような情報があまりなかったようなので、
SendKeysでキーボードのLumLockなどを押すプログラムで
代用できないかと思い、次のように書きました。
        My.Computer.Keyboard.SendKeys("{NUMLOCK}")

これでやってみてもオンの状態でやると一瞬消えるように見えますが、
すぐに戻ってしまいます。
そこで次のようにもやってみました。
        SendKeys.Send("{NUMLOCK}")

しかし結果は同様でした。

何故これでは変更できないのでしょうか?

また、他の方法はあるのでしょうか。

宜しくお願いします。
VBは2008です。
投稿者 もちだ  (社会人) 投稿日時 2011/3/28 08:46:03
http://msdn.microsoft.com/ja-jp/library/cc720817.aspx
検索した感じでは、MSDNのこちらが参考になるかと思います。
NumLock等の状態を確認し、切り替えるサンプルコードも示されています。
VB2005ですが…2008でも動くのではかなろうかと。

MSDNのサンプルから、NumLockだけを抜き出してみました。CheckBox1だけ配置してくださいませ。
流用すれば自動で切り替えることも出来るでしょう(勝手に切り替えるのが良いかは別として)。

Public Class Form1
    Friend Class NativeMethods
        Public Const VK_NUMLOCK As Integer = &H90
        Friend Const KEYEVENTF_KEYUP As Integer = &H2

        Private Sub New()
        End Sub

        <System.Runtime.InteropServices.DllImport("user32.dll")> _
         Friend Shared Sub keybd_event(ByVal bVirtualKey As ByteByVal bScanCode As ByteByVal dwFlags As IntegerByVal dwExtraInfo As Integer)
        End Sub
    End Class

    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.CheckState = CheckState.Checked Then
            SetKeybdStatus(True)
        Else
            SetKeybdStatus(False)
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
        If CheckBox1.Checked <> Control.IsKeyLocked(Keys.NumLock) Then
            CheckBox1.Checked = Control.IsKeyLocked(Keys.NumLock)
        End If
    End Sub

    Private Sub SetKeybdStatus(ByVal bOnOffFlag As Boolean)
        If Control.IsKeyLocked(Keys.NumLock) <> bOnOffFlag Then
            NativeMethods.keybd_event(NativeMethods.VK_NUMLOCK, &H45, 0, 0)
            NativeMethods.keybd_event(NativeMethods.VK_NUMLOCK, &H45, NativeMethods.KEYEVENTF_KEYUP, 0)
        End If
    End Sub
End Class
投稿者 まだまだ  (高校生) 投稿日時 2011/3/28 10:10:04
ありがとうございます。

まさに私が求めていたのはこれです!

無事にVB2008でも動きました。

ありがとうございました。