NumLock等の変更 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 まだまだ  (高校生) 投稿日時 2011/3/28 10:10:04
ありがとうございます。

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

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

ありがとうございました。
投稿者 もちだ  (社会人) 投稿日時 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/27 22:04:26
こんにちは、いつもお世話になっております。

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

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

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

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

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

宜しくお願いします。
VBは2008です。