Anonymous
Прослушивание событий клавиатуры без их использования в X11 — перехват клавиатуры
Сообщение
Anonymous » 25 окт 2025, 01:01
Я пытался написать программу, которая перехватывает сообщения клавиатуры, чтобы произносить имя каждой клавиши при каждом ее нажатии в Ubuntu (KDE); не мешая нормальному действию клавиатуры в программах (просто объявляя название клавиши).
Это моя программа:
Код: Выделить всё
#include
#include
#include
#include
#include
using namespace std;
void SendPressKeyEvent(Display *display, XKeyEvent xkey)
{
Window current_focus_window;
int current_focus_revert;
XGetInputFocus(display, ¤t_focus_window, ¤t_focus_revert);
xkey.type = KeyPress;
xkey.display = display;
xkey.window = current_focus_window;
xkey.root = DefaultRootWindow(display);
xkey.subwindow = None;
xkey.time = 1000 * time(0);
xkey.x = 0;
xkey.y = 0;
xkey.x_root = 0;
xkey.y_root = 0;
xkey.same_screen = True;
XSendEvent(display, InputFocus, True, KeyPressMask, (XEvent *)(&xkey));
}
void SendReleaseKeyEvent(Display *display, XKeyEvent xkey)
{
Window current_focus_window;
int current_focus_revert;
XGetInputFocus(display, ¤t_focus_window, ¤t_focus_revert);
xkey.type = KeyRelease;
xkey.display = display;
xkey.window = current_focus_window;
xkey.root = DefaultRootWindow(display);
xkey.subwindow = None;
xkey.time = 1000 * time(0);
xkey.x = 0;
xkey.y = 0;
xkey.x_root = 0;
xkey.y_root = 0;
xkey.same_screen = True;
XSendEvent(display, InputFocus, True, KeyReleaseMask, (XEvent *)(&xkey));
}
void *TaskCode(void* arg)
{
switch(*(int*)arg)
{
case 38:
system("espeak -v en " "\"a\"");
}
return 0;
}
int main()
{
Display *display = XOpenDisplay(0);
if(display == 0)
exit(1);
XGrabKeyboard(display, DefaultRootWindow(display), True, GrabModeAsync, GrabModeAsync, CurrentTime);
XEvent event;
while(true)
{
XNextEvent(display, &event);
if(event.type == Expose)
{
}
if(event.type == KeyPress)
{
SendPressKeyEvent(display,event.xkey);
if(event.xkey.keycode == 38)
{
pthread_t thread;
int thread_arg = event.xkey.keycode;
pthread_create(&thread,0, TaskCode, (void*) &thread_arg);
}
}
if(event.type == KeyRelease)
SendReleaseKeyEvent(display,event.xkey);
}
XCloseDisplay(display);
}
Эта программа предназначена только для клавиши a, которую можно расширить на другие клавиши.
Но когда эта программа запущена, некоторые программы (например, Chromium) не отображают мигалку (курсор) в своих полях редактирования. Также все горячие клавиши KDE становятся отключенными.
Как это можно исправить?
Подробнее здесь:
https://stackoverflow.com/questions/227 ... rd-hooking
1761343312
Anonymous
Я пытался написать программу, которая перехватывает сообщения клавиатуры, чтобы произносить имя каждой клавиши при каждом ее нажатии в Ubuntu (KDE); не мешая нормальному действию клавиатуры в программах (просто объявляя название клавиши). Это моя программа: [code]#include #include #include #include #include using namespace std; void SendPressKeyEvent(Display *display, XKeyEvent xkey) { Window current_focus_window; int current_focus_revert; XGetInputFocus(display, ¤t_focus_window, ¤t_focus_revert); xkey.type = KeyPress; xkey.display = display; xkey.window = current_focus_window; xkey.root = DefaultRootWindow(display); xkey.subwindow = None; xkey.time = 1000 * time(0); xkey.x = 0; xkey.y = 0; xkey.x_root = 0; xkey.y_root = 0; xkey.same_screen = True; XSendEvent(display, InputFocus, True, KeyPressMask, (XEvent *)(&xkey)); } void SendReleaseKeyEvent(Display *display, XKeyEvent xkey) { Window current_focus_window; int current_focus_revert; XGetInputFocus(display, ¤t_focus_window, ¤t_focus_revert); xkey.type = KeyRelease; xkey.display = display; xkey.window = current_focus_window; xkey.root = DefaultRootWindow(display); xkey.subwindow = None; xkey.time = 1000 * time(0); xkey.x = 0; xkey.y = 0; xkey.x_root = 0; xkey.y_root = 0; xkey.same_screen = True; XSendEvent(display, InputFocus, True, KeyReleaseMask, (XEvent *)(&xkey)); } void *TaskCode(void* arg) { switch(*(int*)arg) { case 38: system("espeak -v en " "\"a\""); } return 0; } int main() { Display *display = XOpenDisplay(0); if(display == 0) exit(1); XGrabKeyboard(display, DefaultRootWindow(display), True, GrabModeAsync, GrabModeAsync, CurrentTime); XEvent event; while(true) { XNextEvent(display, &event); if(event.type == Expose) { } if(event.type == KeyPress) { SendPressKeyEvent(display,event.xkey); if(event.xkey.keycode == 38) { pthread_t thread; int thread_arg = event.xkey.keycode; pthread_create(&thread,0, TaskCode, (void*) &thread_arg); } } if(event.type == KeyRelease) SendReleaseKeyEvent(display,event.xkey); } XCloseDisplay(display); } [/code] Эта программа предназначена только для клавиши a, которую можно расширить на другие клавиши. Но когда эта программа запущена, некоторые программы (например, Chromium) не отображают мигалку (курсор) в своих полях редактирования. Также все горячие клавиши KDE становятся отключенными. Как это можно исправить? Подробнее здесь: [url]https://stackoverflow.com/questions/22749444/listening-to-keyboard-events-without-consuming-them-in-x11-keyboard-hooking[/url]