2012-03-28 5 views
2

Ich versuche eine Anwendung wie Launchy/Enso/etc. Zu erstellen, die erscheint, wenn der Benutzer die Feststelltaste drückt.Wie umgehen Sie die "Sperrung der Vordergrundsperre", um mein Fenster zu aktivieren?

Dazu musste ich einen Low-Level-Tastatur-Hook installieren (WH_KEYBOARD_LL), aus dem ich dann einen Thread spawnen, um den Dialog anzuzeigen, um den Benutzer zu präsentieren.

Das Problem ist, wenn ich irgendwie Fokus stehlen (z. B. durch Klicken auf ein anderes Fenster) und anschließend Caps Lock mit einer kurzen Verzögerung, mein Fenster nicht die Tastatureingabe erhält: Der Eingang geht zum Hintergrundfenster, obwohl mein Fenster "aktiv" ist (aus dem Blick auf die Titelleiste).

Natürlich wird dies ziemlich ärgerlich, da ich dann so etwas wie „Visu“ eingeben Ende (für „Visual Studio“) in einem Textprozessor (oder eine Chat-Box ...) und die Eingabetaste drücken, withotu zu realisieren, dass es nicht das getan hat, was ich vorhatte.

(lustige Sache ist, nach einer 3-Sekunden (oder so) Pause, Titelleiste meines Fensters wird plötzlich „inaktiv“, auch wenn es nie aktiv in erster Linie war!)

Wie kann ich umgehen dieser "Schutz" Mechanismus zu eigentlich mein Fenster aktivieren?

+0

Raymond Chen hat dies auf Old New Thing behandelt ... Sie müssen die Shell-Hotkey-Funktion verwenden, anstatt zu versuchen, den Fokus zu stehlen. –

+0

@BenVoigt: Wie mache ich das mit Caps Lock, während die Eingabe unterdrückt wird? – Mehrdad

+1

Ich schlage vor, Sie beginnen mit dem Lesen Raymonds gesamten "Wettrüsten" -Serie. [Hier ist der, auf den ich bereits hingewiesen habe] (http://blogs.msdn.com/b/oldnewthing/archive/2009/02/26/9445006.aspx). –

Antwort

1

Okay, ich habe endlich einen Hack gefunden. (Microsoft Arbeitgeber: bitte wegschauen ...)

I Intercept Caps Lock mit einem Low-Level-Tastatur-Hook, wenn ich dann VK_CAPITAL erkennen, ich nenne

keybd_event(
    VK_OEM_8, 
    (BYTE)MapVirtualKey(pKBDLLHook->vkCode, MAPVK_VK_TO_VSC), 
    (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) ? KEYEVENTF_KEYUP : 0, 
    0 
); 

aus dem Handler.

Im Wesentlichen ändere ich einfach die Anfrage zu VK_OEM_8.
Beachten Sie jedoch, dass der virtuelle Schlüsselcode nicht dem Scan-Code entspricht. Dies ist beabsichtigt - VK_OEM_8 nicht haben Scan-Code (soweit ich sagen konnte, auf jeden Fall), so dass ich nicht viel von einer Option hatte.

Dann programmiere ich nur auf VK_OEM_8 statt - das ist einfach abzufangen/behandeln/etc.

Ich hoffe, dies hilft anderen Menschen.