2016-06-29 6 views
0

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과 내 코드에서 상태 마스크를 변경합니다.

어떻게 현재 수정 자 키 상태를 올바르게 변경합니까?

+0

내게는 명확하지 않지만 X11 서버보기에서 보내는 키보드 수정 자 상태가 보내는 이벤트의 영향을받을 것으로 기대합니까? –

+0

네, 그런 일이 일어날 것을 기대하고 있습니다. –

답변

0

라이브러리 <X11/extensions/XTest.h>int XTestFakeButtonEvent(display, button, is_press, delay) 메서드를 사용하여 문제를 해결했습니다. 어떤 이유로, 변경자 키를 보낼 때 (위의 경우처럼) 키보드 변경자 상태가 변경되는 반면, 위에서 언급 한 방법은 변경되지 않습니다. xsendevent man 페이지에서

0

:

"전달 된 경우에 True로 send_event에 강제로 올바르게 이벤트에 일련 번호를 설정 제외를 제외하고는 이벤트의 내용은 X 서버가, 그렇지 않으면 변경되지 않은 및 선택 해제합니다. "

나는 다음과 같은 장소에서 createKeyEvent()를 복사 한 가정 http://www.doctort.org/adam/nerd-notes/x11-fake-keypress-event.html

그리고 당신은이 함수가 호출되는 방식 복사 한 경우 : (

createKeyEvent을 표시 winFocus, winRoot, 거짓, 키 코드, 0);

마지막 인수가 "0"이므로 "한정자"가 설정되지 않은 것입니다. 문서에 따르면 변경자 상태를 직접 설정해야합니다.

이 정보를 확인하지 않았습니다. 문서화 된대로 작동하지 않으면 X 서버 구현시 설명서 버그 또는 버그 일 수 있습니다.