Tastatureingaben an aktives Fenster senden

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Re: Tastatureingaben an aktives Fenster senden

Beitrag von Programie »

Einfache Ascii Zeichen lassen sich mit XTestFakeKeyEvent() schon problemlos an andere Anwendungen senden. Jetzt fehlen noch die Modifiers (Shift, Alt, Ctrl, etc.).

xdotool macht das mit einer XModifierKeymap welche von XGetModifierMapping() zurueckgegeben wird. Ich habe gerade mal versucht, das in PB nachzubauen, aber irgendwie stehe ich da gerade noch auf dem Schlauch. Die Modifier Table beinhaltet nichts wirklich sinnvolles bzw. die Werte aendern sich bei jeder Ausfuehrung. Ich denke mal die Werte sollten immer die gleichen sein (zumindest solange der X Server laeuft).

Code: Alles auswählen

EnableExplicit

ImportC "-lX11"
  XOpenDisplay(display)
  XGetModifierMapping(*display)
  XFreeModifiermap(*modmap)
EndImport

Define *display = XOpenDisplay(0)

Define Dim modifierTable(7)
Define *modmap = XGetModifierMapping(*display)
Define maxKeyPerMod = PeekL(*modmap)
Define modifierIndex
For modifierIndex = 0 To 7
  Define modifierKey
  For modifierKey = 0 To maxKeyPerMod - 1
    Define keycode = PeekA(*modmap + 4 + (modifierIndex * maxKeyPerMod) + modifierKey)
    If keycode
      modifierTable(modifierIndex) = keycode
      Break
    EndIf
  Next
Next
XFreeModifiermap(*modmap)

For modifierIndex = 0 To 7
  Debug modifierTable(modifierIndex)
Next
In C sieht die Struktur welche XGetModifierMapping() zurueck gibt so aus:

Code: Alles auswählen

typedef struct {
	int max_keypermod;	/* This server's max number of keys per modifier */
	KeyCode *modifiermap;	/* An 8 by max_keypermod array of the modifiers */
} XModifierKeymap;
KeyCode ist ein Array aus Werten als unsigned char. Ich gehe mal davon aus, das ist in PB mit dem Ascii Type (PeekA bzw. variable.a) vergleichbar.
BildBildBildBild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Tastatureingaben an aktives Fenster senden

Beitrag von ccode_new »

Ich habe jetzt noch nicht so intensiv nachgeforscht.

Aber man kann es ja auch erstmal so lösen:

Code: Alles auswählen

Procedure SendKeyLoop(param)
  Protected *display = XOpenDisplay(0)
  
  Repeat
    Protected symbol, code, code2
    
    ;XStringToKeysym("Right")
    ;XStringToKeysym("Up")
    ;XStringToKeysym("Down")
    ;XStringToKeysym("Return")
    ;XStringToKeysym("space")
    ;XStringToKeysym("BackSpace")
    ;XStringToKeysym("Caps_Lock")
    ;XStringToKeysym("Shift_L")
    ;XStringToKeysym("Shift_R")
    ;XStringToKeysym("Escape")
    ;XStringToKeysym("F1")
    
    symbol = XStringToKeysym("Shift_L")
    code = XKeysymToKeycode(*display, symbol)
    Debug symbol
    Debug code
    
    XTestFakeKeyEvent(*display, code, #True, 0)
    symbol = XStringToKeysym("A")
    code2 = XKeysymToKeycode(*display, symbol)
    XTestFakeKeyEvent(*display, code2, #True, 10) ;letzter Parameter ist ein Delay
    XTestFakeKeyEvent(*display, code, #False, 0) 
    XTestFakeKeyEvent(*display, code2, #False, 10)
    XFlush(*display)
    
    Delay(1000)
  ForEver
EndProcedure
Ist aber nicht die beste Lösung. Daher suche und probiere weiter. ;)

Das mit den XGetModifierMapping() klingt interessant.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Re: Tastatureingaben an aktives Fenster senden

Beitrag von Programie »

Danke, ich werde dann die Key Modifiers erstmal so wie aus deinem Beispiel senden.
BildBildBildBild
Antworten