KeyRepeat Funktion für ein Fenster abstellen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

KeyRepeat Funktion für ein Fenster abstellen

Beitrag von tft »

Hallo,

wie die Beschreibung oben schon erahnen lässt. Möchte ich die KeyRepeat Funktion bei Tastatureingaben für mein Fenster abstellen.
Jemand eine Idee wie das zu machen ist?


Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: KeyRepeat Funktion für ein Fenster abstellen

Beitrag von ccode_new »

Hallo tft,

ich bin mir auch noch nicht ganz sicher, aber es müsste evtl. über die Registry (HKEY_CURRENT_USER\Control Panel\Accessibility\...) gehen.

Du meinst doch garantiert die Windows-Anschlagverzögerung, oder ?

Ok!

Es sollte über diese API gehen:
https://docs.microsoft.com/en-us/window ... etersinfow

und mit dieser Structure:

https://docs.microsoft.com/en-us/window ... filterkeys

über Set_FilterKeys

Hier eine mögliche Lösung: (geht bei mir)

Code: Alles auswählen

Structure tagFILTERKEYS
  cbSize.l
  dwFlags.l
  iWaitMSec.l
  iDelayMSec.l
  iRepeatMSec.l
  iBounceMSec.l
EndStructure

Global FILTERKEYS.tagFILTERKEYS

FILTERKEYS\cbSize = SizeOf(tagFILTERKEYS)
FILTERKEYS\dwFlags = 127 ;= On / 126 = Off (Windows 10)
FILTERKEYS\iWaitMSec = 0
FILTERKEYS\iDelayMSec = 0
FILTERKEYS\iRepeatMSec = 0

SystemParametersInfo_(#SPI_SETFILTERKEYS, SizeOf(tagFILTERKEYS), @FILTERKEYS, #SPIF_UPDATEINIFILE)
Für Unwissende:

Damit wird beim gedrückten Halten einer Taste diese nicht mehr wiederholt.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Re: KeyRepeat Funktion für ein Fenster abstellen

Beitrag von tft »

Hallo,

ich werde das mal ausprobieren, ich habe mir .. weil ich gerade im Flow bin mit diesen Zeilen geholfen.

Code: Alles auswählen


#NoKeyRepeat = 1075838977

If EventWindow() = #MainWindow
        Select Event
           Case #WM_KEYDOWN ; Taste wurde gedrückt
              ;Repeat unterdrückung
              If EventlParam()<>#NoKeyRepeat

TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: KeyRepeat Funktion für ein Fenster abstellen

Beitrag von ccode_new »

Schön,Schön, viele Wege führen zum Ziel, wenn man es dann doch genauer kennt.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: KeyRepeat Funktion für ein Fenster abstellen

Beitrag von hjbremer »

ich weiß zwar nicht wozu man es braucht

aber gut zu wissen, eines Tages vielleicht doch

vielen Dank für die Info :allright:
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
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Re: KeyRepeat Funktion für ein Fenster abstellen

Beitrag von tft »

Hallo

@ ccode_new : Da meine Lösung eher unzuverlässig funktioniert. Habe ich diese eingebaut. Läuft tip top.
jetzt muss ich nur noch den Wert vorher Speichern, damit ich beim verlassen des Programms den Orginal
Zustand wider herstelle.

Gibt es nicht die Möglichkeit das auf ein Bestimmtes Fenster zu begrenzen.?

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: KeyRepeat Funktion für ein Fenster abstellen

Beitrag von ccode_new »

tft hat geschrieben:Gibt es nicht die Möglichkeit das auf ein Bestimmtes Fenster zu begrenzen.?
Das ganze gehört zu den Windows Bedienungshilfe - Einstellungen.

Ich hätte hier einen kleinen Trick:

Code: Alles auswählen

Structure tagFILTERKEYS
  cbSize.l
  dwFlags.l
  iWaitMSec.l
  iDelayMSec.l
  iRepeatMSec.l
  iBounceMSec.l
EndStructure

Global DefaultValues.tagFILTERKEYS

Procedure GetKeyRepeatState(*Filter.tagFILTERKEYS)
  *Filter\cbSize = SizeOf(tagFILTERKEYS)
  If *Filter <> 0
    SystemParametersInfo_(#SPI_GETFILTERKEYS, *Filter\cbSize, *Filter, #SPIF_UPDATEINIFILE)
  EndIf
EndProcedure

Procedure SetKeyRepeatState(*Filter.tagFILTERKEYS, state.b)
  Protected FILTERKEYS.tagFILTERKEYS
  If *Filter <> 0
    If state = 1
      GetKeyRepeatState(*Filter)
      FILTERKEYS\cbSize = SizeOf(tagFILTERKEYS)
      FILTERKEYS\dwFlags = 126
      FILTERKEYS\iWaitMSec = *Filter\iWaitMSec
      FILTERKEYS\iDelayMSec = *Filter\iDelayMSec
      FILTERKEYS\iRepeatMSec = *Filter\iRepeatMSec
      FILTERKEYS\iBounceMSec = *Filter\iBounceMSec
      SystemParametersInfo_(#SPI_SETFILTERKEYS, FILTERKEYS\cbSize, @FILTERKEYS, #SPIF_UPDATEINIFILE)
    Else
      FILTERKEYS\cbSize = SizeOf(tagFILTERKEYS)
      FILTERKEYS\dwFlags = 127
      FILTERKEYS\iWaitMSec = 0
      FILTERKEYS\iDelayMSec = 0
      FILTERKEYS\iRepeatMSec = 0
;       FILTERKEYS\iBounceMSec = 0
      SystemParametersInfo_(#SPI_SETFILTERKEYS, FILTERKEYS\cbSize, @FILTERKEYS, #SPIF_UPDATEINIFILE)
    EndIf
  EndIf
EndProcedure

Procedure IsActive(win_id)
  Protected hWnd
  hWnd = GetForegroundWindow_() 
  If hWnd = win_id 
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Global mywin.i, set_flag = #False

mywin = OpenWindow(#PB_Any, 0, 0, 600, 400, "Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

If mywin
  EditorGadget(0, 10, 10, 580, 380)
  
  Repeat
    If IsActive(WindowID(mywin)) = #True And GetActiveGadget() = 0 And set_flag = #False
      Debug "Aktiv"
      GetKeyRepeatState(@DefaultValues)
      ;Debug DefaultValues\dwFlags
      SetKeyRepeatState(@DefaultValues, 0)
      set_flag = #True
    ElseIf IsActive(WindowID(mywin)) = #False And set_flag = #True
      Debug "Inaktiv"
      SetKeyRepeatState(@DefaultValues, 1)
      ;Debug DefaultValues\dwFlags
      set_flag = #False
    EndIf
    
    Delay(20)
  Until WindowEvent() = #PB_Event_CloseWindow
  SetKeyRepeatState(@DefaultValues, 1)
  End
EndIf
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten