Systemshortcuts ausschalten/einschalten

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
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

Systemshortcuts ausschalten/einschalten

Beitrag 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
Bild

- formerly known as Bananenfreak -
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Systemshortcuts ausschalten/einschalten

Beitrag von mk-soft »

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Andreas21
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

Beitrag 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.
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
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

Beitrag 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.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
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

Beitrag 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.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Systemshortcuts ausschalten/einschalten

Beitrag 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
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
Benutzeravatar
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

Beitrag 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.
Bild

- formerly known as Bananenfreak -
Antworten