SendKeys を実行するとNumLock キーがオフになる現象を回避

2 つ以上の SendKeys ステートメントが連続して実行されると、NumLock キーがオフになる。
この問題は、CapsLock キーと ScrollLock キーにも影響することがあるらしい。
と、Microsoftのサポートにはあるが、1つのステートメントでもオフになる現象が起こっている。
http://support.microsoft.com/kb/179987/ja

<原因-抜粋>
この問題は、1 つ目の SendKeys ステートメントの実行中に 2 つ目の SendKeys ステートメントの実行が開始されるために発生します。

1 つ目の SendKeys ステートメントは、キーボードの状態を保存したうえで、NumLock、CapsLock、ScrollLock をすべてオフにします。
2 つ目の SendKeys ステートメントが実行されるのは、1 つ目の SendKeys ステートメントによるキー ストロークの送信とキーボードの状態の復元が行われる前です。
2 つ目の SendKeys ステートメントの実行時にもキーボードの状態が保存されますが、このとき保存されるのは、それらのキーがすべてオフになっている状態です。最終的に、キーボードの状態は後から保存された状態 (それらのキーがすべてオフになっている状態) で復元されます。

<回避策>WSHをSendKeysの後に実行する

'======================================================
'   SendkeysでNumlockがOFFになるバグを回避する
'   WSH(Windows Scripting Host)
'======================================================

Sub numlock_onoff()
    Dim WshShell
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.SendKeys "{NUMLOCK}"
    Set WshShell = Nothing
End Sub

‘入力リストを展開する
SendKeys “%{down}”
Call numlock_onoff


2021年6月追記WshShellのSendKeysをラップする

VBAのApplication.SendKeysメソッドの使用をやめ、全面的にWshScriptのSendKeysメソッドに置き換える方法が掲載されています。

-以下抜粋-
WshShellのSendKeysを使えば良い、といっても参照設定を追加するのも面倒だし、CreateObjectするのも面倒、ということでサブルーチン化したものがこちらです。


Public Sub wshSendKeys(Keys As String, Optional Wait As Boolean = False)
    'メモリ効率より動作速度を優先する場合
    Static wshShell As Object
    If wshShell Is Nothing Then Set wshShell = CreateObject("WScript.Shell")
    Call wshShell.SendKeys(Keys, Wait)
End Sub

毎回CreateObjectすると負荷が大きくなるので、Static宣言+存在判定をしています。
代わりにオブジェクトを破棄する方法が無くなるので、wshShellオブジェクトがメモリに残り続けます。


9 comments
  1. 三角猫
    三角猫
    2016年3月19日 at 12:34 PM

    VBAのSendKeysが勝手にNumLockを切り替えてしまう不具合の解決策を探し求めて、こちらに辿り着きました。記事のおかげで解決しました。ありがとうございました。

    VBAのSendKeysを全てWshShell.SendKeysに置き換えれば、NumLockをいじる必要がないですね。

    Reply
    • Santa Network
      Santa Network
      2016年3月22日 at 2:21 PM

      コメント、ありがとうございます。
      お役に立ててよかったです。(*^^)v

      Reply
  2. キェルケゴール
    キェルケゴール
    2017年7月1日 at 1:34 PM

    <回避策>WSHをSendkyesの後に実行する  ← kyes 綴り間違い一つ目
    SendkyesでNumlockがOFFになるバグを回避する ← kyes 綴り間違い二つ目
    綴り間違いは直してください。
    1897年8月12日 11:00 PM

    Reply
  3. santane
    santane • Post Author •
    2017年7月30日 at 5:14 PM

    キェルケゴールさん
    綴り間違いのご指摘、ありがとうございました。
    修正しました。(^_^;)

    Reply
  4. saimo
    saimo
    2020年9月26日 at 3:38 PM

    記事にして頂きありがとうございます。
    助かりました。

    Reply
    • santane
      santane • Post Author •
      2020年9月29日 at 7:09 AM

      お役に立ててよかったです。

      Reply
  5. nukesaku
    nukesaku
    2021年6月1日 at 7:11 AM

    Accessのフォームのテキストボックスでこの現象が発生。当初、NumLockをオフで使っているのだなと思い込んでおりました。

    Reply
    • santane
      santane • Post Author •
      2021年6月2日 at 9:46 AM

      2013年の記事ですね。Microsoftのサポートリンクも切れていました。
      現在でもWSHで回避できましたら幸いです。

      Reply

コメントをどうぞ

%d人のブロガーが「いいね」をつけました。