XKeyEvent를 생성하고 XSendEvent를 사용하여 키 이벤트를 보내려고합니다 (this에서 영감을 얻음). 다음과 같이 XKeyEvents이 준비되어 있습니다 XSendEvent가 수정 자 키 상태를 변경하지 않습니다.
XKeyEvent createKeyEvent(Display *display, Window win, Window winRoot, _Bool press, int keycode, int modifiers) {
XKeyEvent event;
event.display = display;
event.window = win;
event.root = winRoot;
event.subwindow = None;
event.time = CurrentTime;
event.x = 1;
event.y = 1;
event.x_root = 1;
event.y_root = 1;
event.same_screen = True;
event.keycode = keycode;
event.state = modifiers;
if (press) {
event.type = KeyPress;
} else {
event.type = KeyRelease;
}
return event;
}
그런 다음 그들은
XSendEvent(event.display, event.window, 1, KeyPressMask, (XEvent *)&event);
과 함께 전송되는 키 이벤트가 전송되는 대상 프로그램을 수신 (문자가 입력되어, 화살표 키 등을 작동). 그러나 변경 키가 있으면 문제가 발생합니다. 프로그램이 opt/alt 키에 대해 키 다운 이벤트를 전송한다고 가정 해 보겠습니다. 이 시나리오에서는 키 업 이벤트가 전송 될 때까지 메뉴 표시 줄의 텍스트에 밑줄이 그어집니다 (X 서버가 키 다운 이벤트를 수신하여 처리했음을 나타냄).
그러나 수정 자 키의 현재 상태를 검색 할 때 수정 자 키가 전혀 눌러지지 않은 것처럼 보입니다. XQueryPointer(self->display, winFocus, &root_return, &child_return, &root_x_return, &root_y_return, &win_x_return, &win_y_return, &keyboard_state_mask);
을 호출하면 keyboard_state_mask가 0입니다. xev
으로 키보드를 확인하면 동일한 결과가 나타납니다. 수정 자 키를 실제로 누르는 것은 xev
과 내 코드에서 상태 마스크를 변경합니다.
어떻게 현재 수정 자 키 상태를 올바르게 변경합니까?
내게는 명확하지 않지만 X11 서버보기에서 보내는 키보드 수정 자 상태가 보내는 이벤트의 영향을받을 것으로 기대합니까? –
네, 그런 일이 일어날 것을 기대하고 있습니다. –