1. XKeyEvent tsKeyboardWidget::createKeyEvent(Display *display, Window &win,
2. Window &winRoot, bool press,
3. int keycode, int modifiers)
4. {
5. XKeyEvent event;
6.
7. event.display = display;
8. event.window = win;
9. event.root = winRoot;
10. event.subwindow = None;
11. event.time = CurrentTime;
12. event.x = 1;
13. event.y = 1;
14. event.x_root = 1;
15. event.y_root = 1;
16. event.same_screen = TRUE;
17. event.state = modifiers;
18. event.keycode = XKeysymToKeycode(display,keycode);
19. if(press)
20. event.type = KeyPress;
21. else
22. event.type = KeyRelease;
23.
24. return event;
25. }
26. int tsKeyboardWidget::SendKeys(int keycode)
27. {
28. //modifier=pubModifier->text().toInt();
29. // Obtain the X11 display.
30. Display *display = XOpenDisplay(NULL);
31. if(display == NULL)
32. return -1;
33.
34. // Get the root window for the current display.
35. Window winRoot;// = XRootWindow(display,1);
36.
37. // Find the window which has the current keyboard focus.
38. Window winFocus;
39. int revert=RevertToParent;
40. //int RevertToParent=0;
41. XGetInputFocus(display, &winFocus,&revert);
42. //winFocus=winFocus+1;
43.
44.
45. // Send a fake key press event to the window.
46. XSelectInput(display, winFocus,FocusChangeMask|KeyPressMask|KeyReleaseMask);
47. XMapWindow(display, winFocus);
48.
49. XKeyEvent event = createKeyEvent(display, winFocus, winRoot, true, keycode, modifier);
50.
51. XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
52.
53. event = createKeyEvent(display, winFocus, winRoot, false, keycode, modifier);
54. XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
55. XCloseDisplay(display);
56. return 0;
57. }
58. void tsKeyboardWidget::btnA_clicked()
59. {
60. SendKeys(Qt::Key_A);
61.
62. }
上面是一段Qt向focus window发送XKeyEvent的代码,比较简单。