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
Systemshortcuts ausschalten/einschalten
Re: Systemshortcuts ausschalten/einschalten
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
-
- Beiträge: 390
- Registriert: 30.08.2004 09:05
- Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64 - Wohnort: Heidelberg
Re: Systemshortcuts ausschalten/einschalten
Man sollte im Callback überprüfen ob man das Fenster im Vordergrund hat und nur dann reagieren, da der Hook Systemweit ist.
Sontzt sind die Tasten Systemweit nicht mehr benutzbar.
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
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
- Chimorin
- Beiträge: 451
- Registriert: 30.01.2013 16:11
- Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit
Re: Systemshortcuts ausschalten/einschalten
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:
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.
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
Naja, dann lasse ich es eben beim Fokus auf der Liste.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Systemshortcuts ausschalten/einschalten
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.
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
Re: Systemshortcuts ausschalten/einschalten
1.Möglichkeit: Spalte null nicht benutzen
2.Möglichkeit
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
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
- Chimorin
- Beiträge: 451
- Registriert: 30.01.2013 16:11
- Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit
Re: Systemshortcuts ausschalten/einschalten
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.
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.