Seite 2 von 2

Re: Tastatureingaben an aktives Fenster senden

Verfasst: 03.12.2018 00:34
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.

Re: Tastatureingaben an aktives Fenster senden

Verfasst: 03.12.2018 20:49
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.

Re: Tastatureingaben an aktives Fenster senden

Verfasst: 04.12.2018 01:00
von Programie
Danke, ich werde dann die Key Modifiers erstmal so wie aus deinem Beispiel senden.