Fragensteller
CapsLock

Frage
-
Moin!ich bau gerade unsere Passworteingabeform um und wollte sowas wie in Win7 einbauen wenn die CapsLock taste gedrückt ist.Leider bekomme ich kein Event wenn die CpasLock Taste gedrückt wurde.Kann man das abfragen?Momentan hab ich halt im Keypress programmiert if CapsLock() ... aber das greift halt erst wenn man irgendeinen Buchtaben drückt nicht wenn chapsLock geändert wird.Jemand eine Idee?GrüßeJörg Schneider
Jörg SchneiderDonnerstag, 27. Oktober 2011 10:02
Alle Antworten
-
Hi Jörg,
im u.a. Code wird mit den WM Events gearbeitet. Wenn Du im Statushandler anstatt den Status in der VFP Statusleiste über eine Messagebox abfangen möchtest, dann steht dem nichts im Wege...
* // Wenn der EVENT-Handler bereits erzeugt wurde, * // dann nichts wie raus hier! IF VARTYPE( [oEventHandler] ) = [O] RETURN .T. ENDIF * // Deklarationen aus WINEVENTS.H inkludieren #INCLUDE WinEvents.H * // Eventhandler erzeugen PUBLIC oEventHandler oEventHandler = CREATEOBJECT( [EventHandler] ) * // Benötigte Events an Handler-Funktion binden BINDEVENT( _VFP.hWnd , WM_KEYUP , oEventHandler , [Statushandler] ) BINDEVENT( _VFP.hWnd , WM_ACTIVATE , oEventHandler , [Statushandler] ) DEFINE CLASS EventHandler AS Custom nOldProc = 0 FUNCTION Init DECLARE INTEGER GetWindowLong IN Win32API ; INTEGER HWND, ; INTEGER nIndex DECLARE INTEGER CallWindowProc IN Win32API ; INTEGER lpPrevWndFunc, ; INTEGER HWND, ; INTEGER Msg, ; INTEGER wParam, ; INTEGER LPARAM DECLARE INTEGER FindWindowEx IN WIN32API ; INTEGER, ; INTEGER, ; STRING, ; STRING DECLARE INTEGER GetWindowText IN Win32API ; INTEGER, ; STRING @, ; INTEGER THIS.nOldProc = GetWindowLong( _SCREEN.HWND , GWL_WNDPROC ) ENDFUNC FUNCTION StatusHandler( hWnd , Msg , wParam , lParam ) DO CASE * // VFP Fenster wurde aktiviert CASE Msg = WM_ACTIVATE * // Sicherstellen, das die Statusleiste * // aktualisiert wird IF VARTYPE( [_Screen.Status_Bar] ) = [O] _Screen.Status_Bar.Refresh_Data ENDIF * // Loslassen von Tasten abfangen CASE Msg = WM_KEYUP * // Wenn CAPSLOCK & NUMLOCK losgelassen IF ( wParam = 20 OR wParam = 144 ) ; AND VARTYPE( [_Screen.Status_Bar] ) = [O] _Screen.Status_Bar.Refresh_Data ENDIF ENDCASE * // Primäre Rückgabe. * // Äquivalent zu VFPs DODEFAULT() RETURN CallWindowProc( This.nOldProc , hWnd , Msg , wParam , lParam ) ENDFUNC ENDDEFINE
Wenn Du diesen Code als PRG in der Entwicklungsumgebung startest, dann erfolgt die Reaktion wie bereits oben beschrieben über die Statusleiste.
Gruss / Best regards -Tom 010101100100011001010000011110000101001001101111011000110110101101110011Donnerstag, 27. Oktober 2011 12:01 -
Hi Tom!Das schaut gut aus. Danke!GrüßeJörg SchneiderAm 27.10.2011 14:01, schrieb Tom Borgmann:> Hi Jörg,>> im u.a. Code wird mit den WM Events gearbeitet. Wenn Du im Statushandler anstatt den Status in der VFP Statusleiste über eine Messagebox abfangen möchtest, dann steht dem nichts im Wege...>> * // Wenn derEVENT-Handler bereits erzeugt wurde,> * // dann nichts wie raus hier!> IF VARTYPE( [oEventHandler] ) = [O]> RETURN .T.> ENDIF>> * // Deklarationen aus WINEVENTS.H inkludieren> #INCLUDE WinEvents.H>> * // Eventhandler erzeugen> PUBLIC oEventHandler> oEventHandler = CREATEOBJECT( [EventHandler] )>> * // Benötigte Events an Handler-Funktion binden> BINDEVENT( _VFP.hWnd , WM_KEYUP , oEventHandler , [Statushandler] )> BINDEVENT( _VFP.hWnd , WM_ACTIVATE , oEventHandler , [Statushandler] )>>> DEFINECLASS EventHandlerAS Custom>> nOldProc = 0>> FUNCTION Init> DECLARE INTEGER GetWindowLongIN Win32API ;> INTEGER HWND, ;> INTEGER nIndex>> DECLARE INTEGER CallWindowProcIN Win32API ;> INTEGER lpPrevWndFunc, ;> INTEGER HWND, ;> INTEGER Msg, ;> INTEGER wParam, ;> INTEGER LPARAM>> DECLARE INTEGER FindWindowExIN WIN32API ;> INTEGER, ;> INTEGER, ;> STRING, ;> STRING>> DECLARE INTEGER GetWindowTextIN Win32API ;> INTEGER, ;> STRING @, ;> INTEGER>> THIS.nOldProc = GetWindowLong( _SCREEN.HWND , GWL_WNDPROC )>> ENDFUNC>> FUNCTION StatusHandler( hWnd , Msg , wParam , lParam )>> DO CASE>> * // VFP Fenster wurde aktiviert> CASE Msg = WM_ACTIVATE>> * // Sicherstellen, das die Statusleiste> * // aktualisiert wird> IF VARTYPE( [_Screen.Status_Bar] ) = [O]> _Screen.Status_Bar.Refresh_Data> ENDIF>> * // Loslassen von Tasten abfangen> CASE Msg = WM_KEYUP> * // Wenn CAPSLOCK& NUMLOCK losgelassen> IF ( wParam = 20OR wParam = 144 ) ;> AND VARTYPE( [_Screen.Status_Bar] ) = [O]> _Screen.Status_Bar.Refresh_Data> ENDIF> ENDCASE>> * // Primäre Rückgabe.> * //Äquivalent zu VFPs DODEFAULT()> RETURN CallWindowProc( This.nOldProc , hWnd , Msg , wParam , lParam )>> ENDFUNC>> ENDDEFINE>>>> Wenn Du diesen Code als PRG in der Entwicklungsumgebung startest, dann erfolgt die Reaktion wie bereits oben beschrieben über die Statusleiste.>> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> Gruss / Best regards -Tom 010101100100011001010000011110000101001001101111011000110110101101110011
Jörg SchneiderDonnerstag, 27. Oktober 2011 14:05 -
Kennt denn keiner mehr die Hilfe?
Schau einfach mal unter CAPSLOCK() nach.
If Capslock()
* freundliche Meldung
Endif
oder auch einfach Capslocks z.B. im When Event ungefragt ausschalten: CAPSLOCK(.F.)
Tschüß, Olaf.
PS: Sorry, ich nehm alles zurück :o), Du benutzt ja schon Capslock(). Aber warum reicht Dir nicht, capsloc bei When oder Gotfocus abzuschalten? Wenn jemand während der Passworteingabe Capslock nutzt, dann vielleicht ja absichtlich.- Bearbeitet Olaf Doschke Donnerstag, 27. Oktober 2011 19:36
Donnerstag, 27. Oktober 2011 19:29 -
Moin Olaf,ich will ja wie Windows bei der Passworteingabe nur einen Hinweis anzeigen dass der User weis dass capslock aktiv ist, und dann sollte das halt auch weggehen, wenn der user das wieder ausschaltet. Und dafür benötige ich dann halt ein Event.Aber das ganze will ich eh nur als nice to have bezeichnen, ich teste mal die verschiedenen vorschläge.Danke schon mal an alleGrüßeJörg schneiderAm 27.10.2011 21:29, schrieb Olaf Doschke:> Kennt denn keiner mehr die Hilfe?>> Schau einfach mal unter CAPSLOCK() nach.>> If Capslock()>> * freundliche Meldung>> Endif>> oder auch einfach Capslocks z.B. im When Event ungefragt ausschalten: CAPSLOCK(.F.)>> Tschüß, Olaf.>> PS: Sorry, ich nehm alles zurück :o), Du benutzt ja schon Capslock(). Aber warum reicht Dir nicht, capsloc bei When oder Gotfocus abzuschalten? Wenn jemand während der Passworteingabe Capslock nutzt, dann vielleicht ja absichtlich.
Jörg SchneiderMittwoch, 2. November 2011 08:27