Seite 1 von 1

Systemshortcuts ausschalten/einschalten

Verfasst: 08.03.2014 19:11
von Chimorin
Heyho,
Ich würde gerne die Systemshortcuts austellen. In meinem Welteditor wird eigentlich von der ganzen Tastatur etwas benutzt.
Nun führt das aber immer wieder zu ungewollten Aktionen, hier ein Beispiel:
WASD: Ist ein Listenelement ausgewählt und man drückt nun eine Buchstabentaste, wird automatisch das erste Element gesucht, das mit diesem Buchstaben beginnt.

Bisher hatte ich es so gelöst, dass die Liste nach einer Auswahl den Fokus verliert, hat auch funktioniert, ist aber eher Gewurstel.

Ich würde gerne die Systemfeatures von Microsoft mit meinem Programm am Anfang deaktivieren und später dann wieder aktivieren.
Hat da jemand eine Idee dazu oder gleich eine Lösung?

Ich habe etwas gefunden, verstehe es aber nicht:
http://msdn.microsoft.com/en-us/library ... s.85).aspx

Re: Systemshortcuts ausschalten/einschalten

Verfasst: 09.03.2014 01:39
von mk-soft

Re: Systemshortcuts ausschalten/einschalten

Verfasst: 09.03.2014 02:14
von Andreas21
Man sollte im Callback überprüfen ob man das Fenster im Vordergrund hat und nur dann reagieren, da der Hook Systemweit ist.

Code: Alles auswählen

EnableExplicit

Procedure.l KeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT)
  If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
    If GetActiveWindow() = 0
      If *p\vkCode = 65
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)
EndProcedure

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  TextGadget(1,10,10,200,20,"Taste ''A'' wird gesperrt.",0)
  StringGadget(2,10,30,200,20,"",0)
  
  SetWindowsHookEx_(#WH_KEYBOARD_LL,@KeyboardHook(),GetModuleHandle_(0),0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Sontzt sind die Tasten Systemweit nicht mehr benutzbar.

Re: Systemshortcuts ausschalten/einschalten

Verfasst: 09.03.2014 10:26
von Chimorin
Hmm, das ist leider nicht das, was ich suche.
Ich würde gerne dem Windowsautomatismus, welcher beim Drücken einer Taste und einem aktiven Listengadget den nächsten Eintrag sucht, der mit diesem Buchstaben beginnt, einhalt gebieten.

Leider kann ich mit dieser Methode nichts mehr mit "A" anfangen, weil dieser Code hier auch nicht funktioniert:

Code: Alles auswählen

EnableExplicit
InitSprite()
InitKeyboard()

Procedure.l KeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT)
  If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
    If GetActiveWindow() = 0
      If *p\vkCode = 65
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)
EndProcedure

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0), 220, 10, 270, 230)
  TextGadget(1,10,10,200,20,"Taste ''A'' wird gesperrt.",0)
  StringGadget(2,10,30,200,20,"",0)
  
  SetWindowsHookEx_(#WH_KEYBOARD_LL,@KeyboardHook(),GetModuleHandle_(0),0)
  Repeat 
    ExamineKeyboard()
    
    If KeyboardReleased(#PB_Key_A)
      Debug "A"
    EndIf
    
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Komischerweise bekomme ich bei jedem 2. oder 3. Tastendruck ein A debuggt, was doch aber eig gar nicht sein darf...

Naja, dann lasse ich es eben beim Fokus auf der Liste.

Re: Systemshortcuts ausschalten/einschalten

Verfasst: 09.03.2014 13:10
von NicTheQuick
Also ich finde ein Hook etwas übertrieben. Ich bin da zwar nicht mehr so drin in dem WinAPI-Kram, aber eigentlich sollte es reichen, wenn man den Callback vom ListIconGadget einfach überschreibt und die Funktion heraus nimmt, die ein Element nach eingegebenen Buchstaben auswählt. Man müsste halt mal schauen, welche Events da auftreten bei der Eingabe von Buchstaben innerhalb des Gadgets, oder gleich die MSDN befragen.

Re: Systemshortcuts ausschalten/einschalten

Verfasst: 09.03.2014 20:34
von hjbremer
1.Möglichkeit: Spalte null nicht benutzen

2.Möglichkeit

Code: Alles auswählen

Procedure.i WindowCallback(hWnd, msg, wParam, lParam) 
   
   Protected result = #PB_ProcessPureBasicEvents 
   
   Protected *nmhdr.NMHDR
   Protected *lvk.LV_KEYDOWN
   
   Select msg 
               
      Case #WM_NOTIFY 
         *nmhdr = lParam
               
         Select *nmhdr\code 
               
            Case #LVN_KEYDOWN
               
                *lvk = lParam               
               
               Debug *lvk\hdr\code        ; = #LVN_KEYDOWN
               Debug *lvk\hdr\hwndFrom    ; = Gadgedid
               Debug *lvk\hdr\idFrom      ; = Gadget PbNr               
               Debug *lvk\wVKey           ; = Keycode
               
               ;hier Abfrage, welches LV
               
               ;eigener Code, wenn gewünscht
               
               ;Weitergabe verhindern
               ProcedureReturn 1
               
         EndSelect
         
   EndSelect
         
   ProcedureReturn result 
EndProcedure

Re: Systemshortcuts ausschalten/einschalten

Verfasst: 10.03.2014 11:26
von Chimorin
hi hjbremer,
Danke für die Antwort. Ein einfaches Leerzeichen reicht unter Umständen schon aus.
Ich benutze Chr(13), das wird nicht angezeigt (Alle Zeichen davor machen Pfeile, Kreise,... Oo) und ich kann die Leertaste noch für Tasten benutzen.