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.