Edited at

[VBS+WinWord]NumLock キーがオンとオフのどちらになっているかを確認する方法はありますか

End If 追加については対応しました。ご指摘ありがとうございます。

削るしかできないみたいですが、謝意を示すべくこのままにしておきます。


要Microsoft Office Word(2019/06/05追加)

ここからあとのVBSCriptはWordがないと動きません。


WMIにはこの機能がない

最近WMIに気が付いたのですが、あらためてデッドリンクの記事を読み直すと、こうしたキー操作はWMIはできない、と書いてありました。

NumLock キーがオンとオフのどちらになっているかを確認する方法はありますか

https://gallery.technet.microsoft.com/scriptcenter/e33ebf60-f07b-4aa4-8b0e-58ef0e368d48

というのは以前、

http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/aug06/hey0810.mspx

で紹介されていた内容でした。いくつかの質問でリンクされているのですが、デッドリンクになっていました。


次のスクリプトでは、リモート コンピュータ atl-fs-01 の NumLock キーの状態を確認します。


IsRemotePCNumLock.vb

Set objWord = CreateObject("Word.Application", "atl-fs-01") 

Wscript.Echo "NumLock key is on: " & objWord.NumLock
objWord.Quit


基本的にこれはVBSCriptで動きます。


IsPCNumLock.vbs

Set objWord = CreateObject("Word.Application") 

Wscript.Echo "CapsLock key is on: " & objWord.CapsLock
objWord.Quit

これはCapsLockもできます。

そこで、Vbscriptでつねにテンキーが起動するようにしてみましょう。


On_NumLock.vbs

Set objWord = CreateObject("Word.Application") 

'msgbox "CapsLock key is on: " & objWord.NumLock
if objWord.Numlock=False then
Set objShell = Wscript.CreateObject("WScript.Shell")
objShell.SendKeys "{NUMLOCK}"
End If
objWord.Quit
set objword = Nothing
set objShell = Nothing

ついでにテンキーオフも


OFFNumLock.vbs

Set objWord = CreateObject("Word.Application") 

'msgbox "CapsLock key is on: " & objWord.NumLock
if objWord.Numlock=True then
Set objShell = Wscript.CreateObject("WScript.Shell")
objShell.SendKeys "{NUMLOCK}"
End If
objWord.Quit
set objword = Nothing
set objShell = Nothing

ついでにCapsもOnOFFしてみましょうか


On_NumLock.vbs

Set objWord = CreateObject("Word.Application") 

'msgbox "NumLock key is on: " & objWord.NumLock
if objWord.Numlock=False then
Set objShell = Wscript.CreateObject("WScript.Shell")
objShell.SendKeys "{NUMLOCK}"
End If
objWord.Quit
set objword = Nothing
set objShell = Nothing

ついでにCapsのオフも


On_CapLock.vbs

Set objWord = CreateObject("Word.Application") 

'msgbox "CapsLock key is on: " & objWord.CapsLock
if objWord.CapsLock=False then
Set objShell = Wscript.CreateObject("WScript.Shell")
objShell.SendKeys "{CAPSLOCK}"
End If
objWord.Quit
set objword = Nothing
set objShell = Nothing


OFFCapLock.vbs

Set objWord = CreateObject("Word.Application") 

'msgbox "CapsLock key is on: " & objWord.CapsLock
if objWord.CapsLock=True then
Set objShell = Wscript.CreateObject("WScript.Shell")
objShell.SendKeys "{CAPSLOCK}"
End If
objWord.Quit
set objword = Nothing
set objShell = Nothing


これらをまとめて、テンキーON,CapsOfFにして音を鳴らすVBSCript


音を鳴らすために1.5秒必要

64/32Biit強制CScript起動で、かつWindow非表示、Wordも非表示です。

あまりにも何もないので、音を鳴らしました。Wscript.Sleep 900 以下では音が鳴りません。

Sleepで時間を稼がないと音が鳴らずに終了します。最初それがわからず、ならないとか思っていました。実際はSleepで時間を稼がないとだめだったのです。


DefaultKeyMode.vbs

’このスクリプトはMicrosoft Office Wordがインストールされていないとエラーになります

'ダブルクリックして起動すると、Numlock On CapsLock Offにして音を鳴らします。
Dim Beep, WSH, objWord, strCommand
Set WSH = CreateObject("WScript.Shell")
'CScript強制起動 窓非表示
IF LCase(WSH.Environment("Process").Item("PROCESSOR_ARCHITECTURE"))="amd64" Then
If InStr(LCase(WScript.FullName),"syswow64") OR InStr(LCase(WScript.FullName),"wscript.exe") Then
strCommand = """" & Replace(Replace(LCase(WScript.FullName),"syswow64","sysnative"),"wscript.exe","cscript.exe") & """ //Nologo //T:120 //I """ & WScript.ScriptFullName & """"
WSH.Run strCommand,0,True
WScript.Quit
End If
Else
'32bit OSの場合は32BitのCscriptにする
If InStr(LCase(WScript.FullName),"wscript.exe") Then
strCommand = """" & Replace(LCase(WScript.FullName),"wscript.exe","cscript.exe") & """ //Nologo //T:120 //I """ & WScript.ScriptFullName & """"
WSH.Run strCommand,0,True
WScript.Quit
End If
End If

Set objWord = CreateObject("Word.Application") : objWord.Visible=False
If objWord.Numlock = False then WSH.SendKeys "{NUMLOCK}" : Wscript.sleep 50
If objWord.CapsLock = True then WSH.SendKeys "{CAPSLOCK}": Wscript.sleep 50
Set WSH = Nothing
objWord.Quit : Set objWord = Nothing
Beep = Chr(7)
Wscript.Echo Beep
Wscript.Echo "OK" CScriptWindowを非表示にしているため見えません
Wscript.sleep 1500 ' Time to Beep Sound about 1500 milliseconds at Least, I Think

#参考
(20190605レイアウト整理、発掘の項目補充)
[vbscriptNUMLOCK判定したい](http://okwave.jp/qa/q6137135.html)

##発掘
[発掘NumLock キーがオンとオフのどちらになっているかを確認する方法はありますか]
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/aug06/hey0810.mspx

>Hey, Scripting Guy! Question
>Scripting Guy さん、よろしくお願いします。コンピュータの NumLock キーがオンとオフのどちらになっているかを確認する方法はありますか。
-- KA
>SpacerHey, Scripting Guy! AnswerScript Center

>KA さん、こんにちは。ところで、Scripting Guy でいることには 2 つの問題があります (私たちが Scripting Guy をして稼げる金額を入れると 3 つの問題になりますが)。まず 1 つとして、Dean が周囲にいる場合は常に警戒する必要があります。なぜでしょうか。ええと、一例を挙げましょう。数か月前、私たちが Scripting Guys とのディナーという特典を楽しんでいたときに、Jean は自分のお皿から一瞬目を離しました。彼女は、視線を戻したときに、Dean が自分の分だけでなく、彼女の分まで食べていることに気付きました (Dean は、すべての料理がテーブルに並べられていたため混乱したと言っています)

>もう 1 つには、人々はいつもあなたが冗談を言っていると思っています。冗談を言っていない場合もそう思われるのです。たとえば、あなたが「コンピュータの NumLock キーがオンとオフのどちらになっているかを確認する方法はありますか」という質問をし、私たちが***「その方法を知る唯一の方法は、Microsoft Word を使用するスクリプトを記述することです」***と答えたとします。あなたは「おや、Scripting Guys さん、また冗談ですか」と言うでしょう。でも、今回、私たちは本当に真剣です。

>いえ、本当です。冗談ではありませんよ。スクリプトに関するさらにもう 1 つの不可解な謎として、NumLock キーがオンになっているかどうか確認する際に***WMIWindows スクリプト ホスト、Shell オブジェクトなどのテクノロジは使用できません。***それなのに、Microsoft Word を使用すると、その作業を行うことができます。

>```vb
Set objWord = CreateObject("Word.Application")
Wscript.Echo "NumLock key is on: " & objWord.NumLock
objWord.Quit



確かに、少し変わっていますが、見方を変えれば、非常に単純なスクリプトでもあります。まず、Word.Application オブジェクトのインスタンスを作成します。ただし、ほとんどの Microsoft Office スクリプトとは異なり、Word を表示可能にする理由がないため、Visible プロパティを True に設定していないことに注意してください。これは、1 つには Word が NumLock プロパティの値を確認するためだけに必要であるからです。NumLock キーがオンになっているかどうかを確認するには、次のコード行を実行するだけです。


Wscript.Echo "Numlock key is on: " & objWord.NumLock


その後、Quit メソッドを呼び出し、Word のインスタンスを終了します。

風変わりですが、効果はあります。

ちなみに、これと同じ基本的な方法を使用して、CapsLock キーがオンになっているかどうかを確認することもできます。異なるのは、CapsLock プロパティの値をエコー バックする点だけです。


Set objWord = CreateObject("Word.Application") 

Wscript.Echo "CapsLock key is on: " & objWord.CapsLock
objWord.Quit


確かに、実際にはローカル コンピュータの NumLock キー (または CapsLock キー) がオンとオフのどちらになっているかを通知するスクリプトは必要ないかもしれません。キーボードをちらっと見れば十分でしょう。それでいいんです。このスクリプトは、リモート コンピュータの NumLock キー (または CapsLock キー) がオンとオフのどちらになっているかを確認する場合にも使用できます。必要なのは、CreateObject メソッドの 2 番目のパラメータとしてリモート コンピュータの名前を渡すことだけです。たとえば、次のスクリプトでは、リモート コンピュータ atl-fs-01 の NumLock キーの状態を確認します。

Set objWord = CreateObject("Word.Application", "atl-fs-01") 

Wscript.Echo "NumLock key is on: " & objWord.NumLock
objWord.Quit

注 : CreateObject が省略可能な 2 番目のパラメータを受け取ることを知らなかったとおっしゃいましたね。では、今こそ Sesame Script (英語) を参照するときでしょう。

このスクリプトでは、NumLock キーの状態を変更できません。つまり、スクリプトは、NumLock キーがオンであることを通知できますが、キーをオフにすることはできません (NumLock プロパティは読み取り専用だからです)。私たちが知っている、NumLock キーのオンとオフを切り替えるためのほぼ唯一の方法は、SendKeys (英語) メソッドを使用することです。

Set objShell = CreateObject("WScript.Shell") 

objShell.SendKeys "{NUMLOCK}"

これは機能しますが、リモート コンピュータでは機能しません (SendKeys はローカル コンピュータでのみ動作します)。ただし、このメソッドはログオン スクリプトで役に立つ場合があります。このようなスクリプトでは、NumLock キーの状態を確認してから、必要に応じて、その状態をオンまたはオフに変更できます。

私たちは、今日のコラムを片付けたら、朝食の時間です。おかしいでしょう。ほんの少し前に、ここに座ってマフィンを食べたばかりなのに。ちょっと待ってください。Dean はどこですか。