c - Sådan omgå 'forgrunds-lås-timeout' for at aktivere mit vindue?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at lave en ansøgning som Launchy/Enso/etc., Som dukker op, når brugeren trykker på Caps Lock-tasten.


For at gøre dette har jeg brug for at installere en lavnøgle tastaturkrog (WH\_KEYBOARD\_LL), hvorfra jeg senere henter en tråd for at vise dialogen til at præsentere for brugeren.


Problemet er, når jeg på en eller anden måde stjæler fokus (f.eks. Ved at klikke på et andet vindue) og derefter trykke på Caps Lock med en kort forsinkelse, får mit tastatur ikke adgang til tastaturet: input går til baggrundsvinduet, selvom mit vindue er 'aktivt' (se på titellinjen).


Selvfølgelig bliver det ret irriterende, da jeg ender med at skrive noget som 'visu' (til 'Visual Studio') inde i en tekstbehandler (eller en chatboks ...) og trykke på Enter, samtidig med at vi indså, at det ikke gjorde det, jeg havde til hensigt.


(Sjovt er, efter en 3 sekunders pause bliver min vindues titellinje pludselig 'inaktiv', selvom den aldrig var aktiv i første omgang!)


Hvordan kan jeg omgå denne 'beskyttelse' mekanisme til faktisk aktivere mit vindue?

Bedste reference


Okay, jeg regnede endelig med et hack. (Microsoft arbejdsgivere: se venligst væk ...)


Jeg opfanger Caps Lock med et lavt tastaturkrog, så når jeg registrerer VK\_CAPITAL, ringer jeg


keybd\_event(
    VK\_OEM\_8,
    (BYTE)MapVirtualKey(pKBDLLHook->vkCode, MAPVK\_VK\_TO\_VSC),
    (wParam == WM\_KEYUP || wParam == WM\_SYSKEYUP) ? KEYEVENTF\_KEYUP : 0,
    0
);


inde fra handleren.


I det væsentlige ændrer jeg bare anmodningen til VK\_OEM\_8.

Bemærk dog, at den virtuelle nøglekode ikke svarer til scanningskoden. Dette er forsætligt - VK\_OEM\_8 har ikke en scanningskode (så vidt jeg kunne fortælle alligevel), så jeg havde ikke meget af en mulighed.


Så programmerer jeg bare baseret på VK\_OEM\_8 i stedet - hvilket er let at opfange/håndtere/etc.


Håber dette hjælper andre mennesker.