初期の問題:
私はオフィスで外付けキーボードを使用しているので、NumLockをオンにします。しかし、私は自宅にいるときにノートパソコンのキーボードを使うだけなので、文字の代わりに数字が表示され、NumLockをオフにする必要があります。SendKeysがバックグラウンドタスクで動作しない
初期解決策: 以下のスクリプトは、1つまたは2つのキーボードを検出し、NumLockを適切にオンまたはオフにします。
新しい問題:
これはコマンドラインからは完全に機能しますが、ログインして自動的に実行するときにトリガーします。バックグラウンドでタスクスケジューラから実行すると、この行は機能しません。
Shell.SendKeys "{NUMLOCK}"
ロックをトグルしますが、トグルしません。エラーは報告されていません。
更新:「ユーザーがログオンしているときのみ」自分のアカウントで実行するようにスケジュールすると、動作しますが、cmdウィンドウが表示されます。自分のアカウントまたはSYSTEMアカウントの下で「ユーザーがログインしているかどうか」を指定して実行すると、ウィンドウがうまく消えてしまいますが動作しません。
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
Found HID Keyboard Device
Found HID Keyboard Device
numLock is OFF
Toggling Numlock
ので、スクリプト自体が正しく動作している:それはロックを切り替える必要があるときに、CMDまたはスケジュールされたタスクとして実行から
かどうかは、私はこの出力を取得します。
UPDATE2:バックグラウンドタスクとして実行しているときにウィンドウステーションを持たないと思われるようです。 DetectNumlockConsole.exe
が動作していないことがわかります。すなわち、この作品、
numLock = Control.IsKeyLocked(Keys.NumLock);
再びこの行の結果を返す単純なC#アプリケーションの場合に実行「のみユーザーがログオンしているとき」ではなく「ユーザーがかログインしているかどうか。」
Windowsのセキュリティの仕組みである--------- VBSスクリプト-----------
set OUT = WScript.StdOut
Set Shell=CreateObject("Wscript.Shell")
Dim KeyCount
KeyCount = 0
Computer = "."
'set NumLock = CheckState
Set WMIService = GetObject("winmgmts:\\" & Computer & "\root\cimv2")
Set Devices = WMIService.ExecQuery ("Select * From Win32_USBControllerDevice")
For Each Device in Devices
DeviceName = Device.Dependent
Quotes = Chr(34)
DeviceName = Replace(DeviceName, Quotes, "")
DeviceNames = Split(DeviceName, "=")
DeviceName = DeviceNames(1)
Set USBDevices = WMIService.ExecQuery ("Select * From Win32_PnPEntity Where DeviceID = '" & DeviceName & "'")
For Each USBDevice in USBDevices
'OUT.WriteLine USBDevice.Description ' Write description to command line to see what to look for
If InStr(LCase(USBDevice.Description), "keyboard") <> 0 Then
KeyCount = KeyCount + 1
OUT.WriteLine "Found " & USBDevice.Description
End If
Next
Next
dim numLock
numLock = Shell.Run("DetectNumlockConsole.exe",0,True)
If (numLock = 0) Then
OUT.WriteLine "numLock is OFF"
Else
OUT.WriteLine "numLock is ON"
End If
' If we have a keyboard, and numlock is OFF
' Or we don't have a keyboard, and numlock is ON
' Then toggle it
If (((KeyCount > 1) AND (numLock = 0)) OR ((KeyCount = 1) AND (numLock = 1))) Then
Shell.SendKeys "{NUMLOCK}" ' *** Problem here, doesn't toggle **
OUT.WriteLine "Toggling Numlock"
End If
これはどのようにC#関連の質問ですか? –
@SirRufo 1つのC#行を追加したときにシステムがタグを提案しました。 C#コードが動作していなかったので追加しました。しかし、私はそれが属していないことに同意します。 – BWhite