Numlock probleem Windows 10

©johanok / at / gmail adres

De numlock-toets staat uit als ik Windows 10 opstart. En als mijn laptop uit schermbeveiliging komt, staat hij weer uit, zelfs als hij tevoren aan stond.

Dit is een gekend probleem in Windows 8, 8.1 en 10. Na een zoektocht doorheen zoekmachines vind je uiteenlopende oplossingen.

Vooral dat gedeelte "uit schermbeveiliging of slaapstand komen", daar is een oplossing niet evident. Vooreerst heb je de eenvoudige tips: er is veel kans dat Windows 10 de instelling van de numlock onthoudt bij het herstarten. Dat is uiteraard eenvoudig om te testen. In het loginscherm (moest je daar numerieke karakters gebruiken) zorg je dat de numlock aan staat, en in plaats van daadwerkelijk in te loggen, schakel de PC vanuit dat scherm uit. Herstart en test even. Idem voor een volledig opgestarte Windows 10, daar kan je hetzelfde doen: herstarten en testen.

Er zijn sites waar je de raad krijgt om de registry aan te passen, om de sleutel
HKEY_USERS\.DEFAULT\Control Panel\Keyboard InitialKeyboardIndicators (eventueel aan te maken - REG_SZ) en een waarde te geven van 2147483648 of 2 of 2147483650. Die tips waren goed op mijn Windows 10, behalve wanneer die uit slaapstand kwam. Numlock was dan altijd uit. Overigens vangen wij in de zomer kittens op, en die lopen geregeld over mijn toetsenbord. Maar zelfs dan heb ik graag dat het numerieke klavier actief staat na herstarten.

De slechtste tip die ik hierover kon lezen was de volgende: maak met kladblok een visual basic script aan, dat je bvb. numlock.vbs ("opslaan als") noemt. Inhoud van het script:


set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "{NUMLOCK}"


Vervolgens moest je dat script zetten in de "startup"-folder
C:\Users\[gebruikersnaam]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Makkelijkere manier om deze folder te zien is rechts klikken op de startknop, kies "uitvoeren", typ daar

shell:startup
Dan opent er een verkenner met de juiste folder actief.

Die folder is correct, maar het script is zonder meer dom. Dit is het equivalent van een een kapotte analoge klok: die staat ook 2 keer per dag juist. Stel dat Windows 10 opstart met de numlock aan, dan zet dat script die terug uit. Dom. Numlock is een toggle-toets, aan of uit. Een {NUMLOCK} versturen met sendkeys kan dus zowel aan- als uitzetten. Ik kan dus evengoed kittens over mijn toetsenbord laten lopen. Je kan het script niet eens verbeteren: vbscript kan op geen enkele manier de Windows API benaderen om eerst na te kijken of de numlock al dan niet aan stond.

Uitvoerbare code die eerst nakijkt of de uitvoering zinvol is, is al heel wat intelligenter.

Een echte programmeertaal?

Ik heb niets tegen het commando "sendkeys", doch in vrijwel alle voorbeelden die je op internet vindt, wordt dat verkeerd gebruikt. Je mag het enkel gebruiken als alle andere mogelijkheden (Windows API SetWindowText naar een handle bvb.) uitgeput zijn, en je moet dat steeds voorwaardelijk gebruiken, overigens bijna altijd om te checken of de juiste applicatie (die de toetsaanslagen moet ontvangen) de focus heeft. Maar we gaan nu iets heel anders doen. VBscript is namelijk veel te beperkt omdat het niet kan lezen of schrijven naar de Windows API.

Om een echt computerprogramma te maken, heb je een compiler / linker nodig. Er zijn er heel wat prima gratis compilers te vinden, voor zowat alle programmeertalen. Om een klein en snel programma te maken, is er niets beter dan assembler. "Flat Assembler" is gratis te downloaden op http://flatassembler.net/download.php. Als je dat downloadt en de .zip uitpakt en ergens installeert, pas gewoon even het tweede lijntje van het .ini- bestandje aan naar de locatie waar alles staat, en je bent klaar om te programmeren. Volgende code kan je gewoon plakken in FASMW.EXE:


format PE GUI 4.0
entry start
include 'win32a.inc'
section '.text' code readable executable
start:      invoke  GetKeyState, VK_NUMLOCK          ; kijk of Numlock aan staat
            or      eax, eax                         ; (eax is nonzero indien Numlock actief is)
            jnz     .eindprog                        ; indien aan: niets doen (jnz jump if not zero)
            invoke  keybd_event, VK_NUMLOCK, 0, 1, 0 ; zoniet emuleer numlock toets induwen
            invoke  keybd_event, VK_NUMLOCK, 0, 3, 0 ; en loslaten
.eindprog:  invoke  ExitProcess, 0                   ; einde programma
section '.idata' import data readable writeable
  library user32, 'USER32.DLL', kernel32, 'KERNEL32.DLL'
  include 'api\user32.inc'
  include 'api\kernel32.inc' 
Als je deze code uitvoert (F9-toets in Fasmw.exe) dan loopt het programma 1 keer, en dan is de exe ook aangemaakt (fasm zal eerst vragen om de code ergens op te slaan - kies bvb. "numlock.asm"). Aan het verklikkerlichtje van de numlock kan je zien dat de code de numlock enkel aanzet, nooit uit. Voor de puristen die dit graag in 64-bits hebben:

format PE64 GUI 5.0
entry start
include 'win64a.inc'
section '.text' code readable executable
start:      sub     rsp, 8
            invoke  GetKeyState, VK_NUMLOCK          ; kijk of Numlock aan staat
            or      rax, rax
            jnz     .eindprog                        ; indien aan: niets doen
            invoke  keybd_event, VK_NUMLOCK, 0, 1, 0 ; zoniet emuleer numlock toets induwen
            invoke  keybd_event, VK_NUMLOCK, 0, 3, 0 ; en loslaten
.eindprog:  invoke  ExitProcess, 0
section '.idata' import data readable writeable
  library user32, 'USER32.DLL', kernel32, 'KERNEL32.DLL'
  include 'api\user32.inc'
  include 'api\kernel32.inc' 
De exe die je hiermee aanmaakt kan je zetten in de folder die je opent met shell:startup (zie hoger), na elke herstart zal de numlock aan staan. Dit heeft bij mij één van de twee "numlock"-problemen opgelost. Bleef het probleem dat na schermbeveiliging / slaapstand de numlock nog uit stond. Maar dit kan eenvoudig opgelost worden:
  • Rechts klikken op de startknop
  • Klik op "Configuratiescherm"
  • Klik op "Systeem en beveiliging"
  • Klik op "Energiebeheer"
  • Klik nu links in het menu op "Het gedrag van de aan/uit-knoppen bepalen
  • Klik op "Instellingen wijzigen die momenteel niet beschikbaar zijn" (in het blauw)
  • Het vinkje op "Snel opstarten inschakelen (aanbevolen)" uitvinken.
Da's alles. Na afsluiten of herstarten of slaapstand onthoudt de numlock zijn laatste toestand. En met die kleine exe in de opstartfolder, is dat altijd "aan".

Problemen met virusscanners?

Sommige gratis virusscanners geven "valse positieven": ze alarmeren voor onschuldige programma's. Panda heeft dat, Comodo an Avast ook. Soms zelfs gewoon bij het opstarten van Fasmw.exe (een onschuldige compiler dus), anderen bij het starten van de code hierboven (hier zie je zelf dat er niets boosaardig inzit). AVG heeft dat al veel minder, hoewel ik ook hier valse positieven krijg tijdens het programmeren, vooral in Delphi. Overigens kan ik de exe hierboven gewoon mailen naar wie die zou nodig hebben. Je kan een bestand gratis op meerdere virusscanners testen op https://www.virustotal.com/nl/

©johanok / at / gmail adres

Snellere functies in Delphi
De programmastructuur in Windows
Een Windowsprogramma in fasm
Kleinere exe in Delphi zonder de VCL