Anfangsproblem:
Ich benutze eine externe Tastatur im Büro, also möchte ich die NumLock ON. Aber wenn ich zu Hause bin, benutze ich einfach die Laptop-Tastatur, also bekomme ich Nummern statt Buchstaben und ich muss NumLock ausschalten.SendKeys funktioniert nicht von Hintergrundaufgabe
Erste Lösung: Das folgende Skript erkennt eine oder zwei Tastaturen und schaltet NumLock entsprechend ein oder aus.
Neues Problem:
Dies funktioniert perfekt von der Befehlszeile, aber ich möchte es auslösen, wenn ich mich anmelde und automatisch geschehen. Wenn ich es aus Taskplaner im Hintergrund ausführen, funktioniert diese Zeile nicht:
Es wird ausgelöst, aber nicht die Sperre umschalten. Keine Fehler gemeldet.
UPDATE: Wenn ich es unter meinem Konto "nur wenn Benutzer angemeldet ist" läuft, dann funktioniert es, aber zeigt das cmd-Fenster. Wenn ich es unter meinem Konto oder unter dem System-Konto mit "ob Benutzer angemeldet ist oder nicht" das Fenster geht schön weg, aber es funktioniert nicht.
Ob von cmd oder als geplante Aufgabe ausführen, bekomme ich diese Ausgabe, wenn er die Sperre wechseln sollte:
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
So das Skript selbst ordnungsgemäß funktioniert.
UPDATE2: Sieht so aus, als ob es etwas damit zu tun haben könnte, keine Windows-Station zu haben, wenn es als Hintergrundaufgabe ausgeführt wird. Stellt sich heraus, dass DetectNumlockConsole.exe
funktioniert auch nicht. Das ist eine einfache C# -Anwendung, die die Ergebnisse dieser Linie
numLock = Control.IsKeyLocked(Keys.NumLock);
wieder zurückgibt, das funktioniert bei der Ausführung „nur dann, wenn Benutzer angemeldet ist“, aber nicht „ob Benutzer angemeldet ist oder nicht.“
--------- vbs Skript -----------
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
Wie ist das eine C# bezogene Frage? –
@SirRufo Das System hat das Tag vorgeschlagen, als ich die eine C# -Linie hinzugefügt habe. Ich fügte es hinzu, weil der C# -Code auch nicht funktionierte. Aber ich stimme zu, dass es nicht dazugehört. – BWhite