So, habe es jetzt zumindest mal geschafft, dass mein Programm nicht mehr durch einen Invalid Memory Access crashed. Aber es funktioniert einfach nicht. Es kommen keine Tastatureingaben an (auch nicht in den StringGadgets von dem Programm selbst)...
Hier ist mein aktueller Stand:
Code:
EnableExplicit
ImportC ""
gdk_screen_get_active_window(*screen)
gdk_screen_get_default()
gdk_x11_window_get_xid(*window)
EndImport
ImportC "-lX11"
XOpenDisplay(*display)
XSendEvent(display, xWindow, propagate, event_mask, event_send)
XStringToKeysym(string.p-utf8)
XFlush(display)
EndImport
Structure XKeyEvent
type.i ; KeyPress or KeyRelease
serial.l ; # of last request processed by server
send_event.i ; true if this came from a SendEvent request
*display ; Display the event was read from
window.i ; ''event'' window it is reported relative to
root.i ; root window that the event occurred on
subwindow.i ; child window
time.i ; milliseconds
x.i ; pointer x coordinate in event window
y.i ; pointer y coordinate in event window
x_root.i ; x coordinate relative to root
y_root.i ; y coordinate relative to root
state.i ; key or button mask
keycode.i ; detail
same_screen.i; same screen flag
EndStructure
Structure charcodemap
key.w
code.a
symbol.l
group.i
modmask.i
needs_binding.i
EndStructure
#KeyPressMask = 1
#KeyPress = 2
#KeyRelease = 3
Procedure SendKey(*display, *key.charcodemap, modstate)
Protected *gdkWindow = gdk_screen_get_active_window(gdk_screen_get_default())
Debug *gdkWindow
Protected xWindow = gdk_x11_window_get_xid(*gdkWindow)
Debug xWindow
Protected mask = modstate | *key\modmask
Protected keyEvent.XKeyEvent
keyEvent\display = *display
keyEvent\subwindow = 0
keyEvent\time = 0
keyEvent\same_screen = #True
keyEvent\window = xWindow
keyEvent\keycode = *key\code
keyEvent\state = mask | *key\group << 13
keyEvent\type = #KeyPress
XSendEvent(*display, keyEvent\window, #True, #KeyPressMask, keyEvent)
XFlush(*display)
Delay(100)
keyEvent\type = #KeyRelease
XSendEvent(*display, keyEvent\window, #True, #KeyPressMask, keyEvent)
XFlush(*display)
EndProcedure
Procedure SendKeyLoop(param)
Protected *display = XOpenDisplay(0)
Repeat
Protected symbol = XStringToKeysym("A")
Debug symbol
Protected key.charcodemap
key\code = 0
key\symbol = symbol
key\needs_binding = 1
SendKey(*display, key, 0)
Delay(1000)
ForEver
EndProcedure
If OpenWindow(0, 0, 0, 500, 130, "Test", #PB_Window_ScreenCentered)
StringGadget(0, 10, 10, 480, 30, "")
StringGadget(1, 10, 50, 480, 30, "")
StringGadget(2, 10, 90, 480, 30, "")
SetActiveGadget(0)
CreateThread(@SendKeyLoop(), 0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Einiges davon habe ich mir aus dem
Code vom xdotool zusammengebastelt.