locked
CapsLock RRS feed

  • 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üße
    Jörg Schneider
     

    Jörg Schneider
    Donnerstag, 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 010101100100011001010000011110000101001001101111011000110110101101110011
    Donnerstag, 27. Oktober 2011 12:01
  • Hi Tom!
     
    Das schaut gut aus. Danke!
     
    Grüße
    Jörg Schneider
     
    Am 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 Schneider
    Donnerstag, 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 alle
     
    Grüße
    Jörg schneider
     
    Am 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 Schneider
    Mittwoch, 2. November 2011 08:27