Отправка нажатий клавиш через Python Xlib в Linux - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь автоматизировать отправку нажатий клавиш в веб-браузер в Linux, который отображается на дисплее VNC.

Код генерирует следующий вывод с ошибкой фокуса и не отправляет нажатий клавишв браузер FireFox.

Может кто-нибудь сказать мне, что вызывает проблему?

#!/usr/bin/env python3

import Xlib
import time

def TypeKey(x_display, x_window, strKeyToType):

    x_keysym = Xlib.XK.string_to_keysym(strKeyToType)
    print('x_keysym created for "' + strKeyToType + '".')
    x_keycode = x_display.keysym_to_keycode(x_keysym)
    print('x_keycode created.')

    x_eventKeyPress = Xlib.protocol.event.KeyPress(
       time = int(time.time()),
       root = x_display.screen().root,
       window = x_window,
       same_screen = 0, child = Xlib.X.NONE,
       root_x = 0, root_y = 0, event_x = 0, event_y = 0,
       state = 0,
       detail = x_keycode)
    print('x_eventKeyPress created.')
    x_eventKeyRelease = Xlib.protocol.event.KeyRelease(
       time = int(time.time()),
       root = x_display.screen().root,
       window = x_window,
       same_screen = 0, child = Xlib.X.NONE,
       root_x = 0, root_y = 0, event_x = 0, event_y = 0,
       state = 0,
       detail = x_keycode)
    print('x_eventKeyRelease created.')

    x_window.send_event(x_eventKeyPress, propagate=True)
    print('x_eventKeyPress sent.')
    x_display.sync()
    print('after first display-sync.')
    x_window.send_event(x_eventKeyRelease, propagate=True)
    print('x_eventKeyRelease sent.')
    x_display.sync()
    print('after second display-sync.')
    print('')

###############################################################################
#Locate a FireFox web browser, focus it, type a URL,
#and send the enter key.
###############################################################################

#connect to the VNC display
x_displayVnc = Xlib.display.Display(':1')
print('Display name:  "' + x_displayVnc.get_display_name() + '"\n')

#locate the window that we want.
x_screen_infoVnc = x_displayVnc.screen()
x_window_listRootChildren = x_screen_infoVnc.root.query_tree().children

iWindowCount = 0
x_windowWebBrowser = None
for x_window in x_window_listRootChildren:    
    iWindowCount += 1
    print(str(iWindowCount) + '.')
    print('Window name:  ' + str(x_window.get_wm_name()))
    print('Window class:  ' + str(x_window.get_wm_class()))
    print('Window client machine:  ' + str(x_window.get_wm_client_machine()))
    print('')

    if str(x_window.get_wm_name()) == 'Firefox' and \
        str(x_window.get_wm_class()) == "('firefox-esr', 'Firefox-esr')":
        x_windowWebBrowser = x_window 

#type the URL and press enter key on the web browser window.
x_displayVnc.set_input_focus(x_windowWebBrowser, Xlib.X.RevertToNone, Xlib.X.CurrentTime)
print('\nset_input_focus() called successfully!\n')
x_displayVnc.sync()

strToType = 'http://www.stackoverflow.com'
for strCharacterToType in strToType:
    TypeKey(x_displayVnc, x_windowWebBrowser, strCharacterToType)

TypeKey(x_displayVnc, x_windowWebBrowser, 'enter')

#close the VNC display connection
x_displayVnc.close()

Отображаемое имя: ": 1"

  1. Имя окна: нет Класс окна: нет Клиентская машина окна: нет

  2. Имя окна: нет Класс окна клиента: нет Клиентская машина окна: нет

  3. Имя окна: нет Класс окна: нет Клиентская машина окна: нет

  4. Имя окна: нет Класс окна клиента: нет Клиентская машина окна: нет

  5. Имя окна: нет Класс окна: нет Клиентская машина окна: нет

  6. Имя окна: нет Класс окна клиента: нет Клиентская машина окна: нет

  7. Имя окна: нет Класс окна: нет Клиентский компьютер с окном: нет

  8. Winимя окна: нет Класс окна: нет Клиентская машина окна: нет

  9. Имя окна: нет Класс окна клиента: нет Клиентская машина окна: нет

  10. Имя окна: нет Класс окна: нет Машина клиента окна: нет

  11. Имя окна: xfce4-session Класс окна: ('xfce4-session', 'Xfce4-session') Клиентская машина окна: debian

  12. Имя окна: xfsettingsd Класс окна: ('xfsettingsd', 'Xfsettingsd') Клиентский компьютер с окном: debian

  13. Имя окна:xfwm4 Класс окна: ('xfwm4', 'Xfwm4') Клиентский компьютер окна: debian

  14. Имя окна: xfce4-power-manager Класс окна: ('xfce4-power-manager','Xfce4-power-manager') Клиентский компьютер с окном: debian

  15. Имя окна: нет Класс окна: нет Компьютерный клиент с окном: нет

  16. Имя окна: evolution-alarm-notify Класс окна: ('evolution-alarm-notify', 'Evolution-alarm-notify') Клиентский компьютер окна: debian

  17. Имя окна: Thunar Класс окна: ('Thunar', 'Thunar') Клиентский компьютер с окном: debian

  18. Имя окна: xfce4-panel Класс окна:('xfce4-panel', 'Xfce4-panel') Клиентский компьютер с окном: debian

  19. Имя окна: xfwm4 Класс окна: ('xfwm4', 'Xfwm4') Клиентский компьютер с окном:debian

  20. Имя окна: нет Класс окна: нет Клиентский компьютер с окном: нет

  21. Имя окна: xfdesktop Класс окна: ('xfdesktop','Xfdesktop') Клиентский компьютер с окном: debian

  22. Имя окна: апплет NetworkManager Класс окна: ('nm-applet', 'Nm-applet') Клиентский компьютер с окном: debian

  23. Имя окна: нет Класс окна: нет Клиентская машина окна: нет

  24. Имя окна: нет Класс окна клиента: нет Клиентская машина окна: нет

  25. Имя окна: нет Класс окна: нет Клиентская машина окна: нет

  26. Имя окна: нет Класс окна: нет WiКлиентская машина ndow: Нет

  27. Имя окна: Нет Класс окна: нет Клиентская машина окна: Нет

  28. Имя окна: Нет Класс окна: нетОконный клиент: Нет

  29. Имя окна: wrapper-1.0 Класс окна: ('wrapper-1.0', 'Wrapper-1.0') Оконный клиент: debian

  30. Имя окна: нет Класс окна: нет Машина клиента окна: нет

  31. Имя окна: wrapper-1.0 Класс окна: нет Машина клиента окна: debian

  32. Имя окна: wrapper-1.0 Класс окна: ('wrapper-1.0', 'Wrapper-1.0') Клиентский компьютер окна: debian

  33. Имя окна:Класс окна: нет Клиентский компьютер окна: нет

  34. Имя окна: нет Класс окна: нет Клиентский компьютер с окном: нет

  35. Имя окна: xfce4-panel Класс окна: ('xfce4-panel', 'Xfce4-panel') Клиентский компьютер с окном: debian

  36. Имя окна: xfce4-panel Класс окна: ('xfce4-panel', 'Xfce4-panel') Клиентский компьютер с окном: debian

  37. Имя окна: xfce4-panel Класс окна: ('xfce4-panel', 'Xfce4-panel') Клиентский компьютер с окном: debian

  38. Имя окна: xfce4-panel Класс окна: ('xfce4-panel', 'Xfce4-panel') Клиентский компьютер с окном: debian

  39. Имя окна: xfce4-panel Класс окна: ('xfce4-panel', 'Xfce4-panel') Клиентский компьютер с окном: debian

  40. Имя окна: xfce4-panel Класс окна: ('xfce4-panel', 'Xfce4-panel') Клиентский компьютер с окном: debian

  41. Имя окна: Firefox Класс окна: ('firefox-esr', 'Firefox-esr') Клиентский компьютер с окном: debian

  42. Имя окна: Класс окна: ('Toplevel', 'Firefox-esr') Клиентский компьютер с окном: debian

  43. Имя окна: Firefox Класс окна: нет Клиентский компьютер с окном: debian

  44. Имя окна: Firefox Класс окна: нет Клиентский компьютер с окном: debian

  45. Имя окна: / usr / lib / firefox-esr / firefox-esr Класс окна: ('/ usr / lib / firefox-esr / firefox-esr', '/ usr / lib / firefox-esr / firefox-esr') Клиентский компьютер с окном: debian

  46. Имя окна: / usr / lib / firefox-esr / firefox-esr Класс окна: ('/ usr / lib / firefox-esr / firefox-esr', '/ usr / lib / firefox-esr / firefox-esr') Клиентский компьютер с окном: debian

  47. Имя окна: Класс окна терминала: ('gnome-Terminal-Server', 'Gnome-Terminal-Server') Клиентский компьютер с окном: debian

  48. Имя окна: Терминал Класс окна: Нет Клиентский компьютер с окном: debian

  49. Имя окна: нет Класс окна: нет Клиентский компьютер с окном: нет

  50. Имя окна: Терминал Класс окна: ('gnome-терминал-сервер', 'Gnome-терминал') Клиентский компьютер с окном: debian

set_input_focus () успешно вызван!

Ошибка протокола X: : code = 8, resource_id = 79691777, sequence_number = 213, major_opcode = 42, minor_opcode = 0

x_keysym создан для "h". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "t". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "t". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "p". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для ":". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "/". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "/". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "w". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "w". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "w". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "." x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "s". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "t". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "a". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "c". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "k". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "o". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "v". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "e". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "r". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "f". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "l". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "o". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "w". x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "." x_keycode создан. x_eventKeyPress создан. x_eventKeyRelease создан. x_eventKeyPress отправлено. после первого Дисплей-синхронизация. x_eventKeyRelease отправлено. после второй синхронизации дисплея.

x_keysym создан для "c". x_keycode создан. x_eventKeyPress создан.x_eventKeyRelease создан.x_eventKeyPress отправлено.после первой синхронизации дисплеяx_eventKeyRelease отправлено.после второй display-sync.

x_keysym создан для "o".x_keycode создан.x_eventKeyPress создан.x_eventKeyRelease создан.x_eventKeyPress отправлено.после первой синхронизации дисплеяx_eventKeyRelease отправлено.после второй display-sync.

x_keysym создан для "m".x_keycode создан.x_eventKeyPress создан.x_eventKeyRelease создан.x_eventKeyPress отправлено.после первой синхронизации дисплеяx_eventKeyRelease отправлено.после второй display-sync.

x_keysym создан для «ввода».x_keycode создан.x_eventKeyPress создан.x_eventKeyRelease создан.x_eventKeyPress отправлено.после первой синхронизации дисплеяx_eventKeyRelease отправлено.после второй синхронизации дисплея.

...