2012-02-23 2 views
4

내가 Xlib를하고 XTestFakeKeyEvent를 사용하여 응용 프로그램에 키를 보내려고 latences, 그리고 다음 코드를 사용하여, 잘 작동 : 선택 목록 [selectWindow] 내가 데이터를 전송 창입니다Xlib를, XTestFakeKeyEvent는

XSetInputFocus(disp, list[selectWindow],RevertToPointerRoot,CurrentTime); 
for(i=0;i<hello.size();i++){ 
    tamper[0] = hello[i]; 
    KeySym key = XStringToKeysym(tamper); 
    XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, key),True, CurrentTime); 
    XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, key),False, CurrentTime); 
} 

, 그리고 char [2]를 변경한다. (hello [i]에서 char *로 함수를 변환한다.) 이 코드는 hello wariable의 내용을 선택된 창에 쓴다. 그러나, 나는 Return 키를 보내려고했다.

XSetInputFocus(disp, list[selectWindow],RevertToPointerRoot,CurrentTime); 
XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, XK_Return),True, CurrentTime); 
XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, XK_Return),False, CurrentTime); 

그래서 다시 창을 선택하고 X K_Return 키를 응용 프로그램에 반환하지만 작동하지 않습니다. Xlib과 '지연'때문에 'for'루프 끝에 wait (2)를 넣으면 잘 동작하지만 나는 메시지를 보낼 때마다 2 초 동안 기다리고 싶지 않습니다.

어떻게 해결할 수 있는지 알 수 없습니다.

감사합니다.

+0

이 똑같은 문제가 있습니다. 두 가지 해결 방법을 찾았습니다. 첫째, 전송 후 대기. 나는 2 초보다 훨씬 오래 기다릴 수 있음을 발견했다. usleep을 사용하면 10 분의 1 초만으로 작동합니다. 둘째, 두 개 이상의 리턴을 보내면 첫 번째를 제외한 모든 리턴이 올바르게 작동합니다 ("수면"없음). – MPT

+0

@MPT,'nanosleep() '도 사용할 수 있습니다. –

답변

1

XTestFakeKeyEvent를 호출 한 후 XFlush (disp) 또는 XSync (disp, false)?

+0

이 두 가지 (또는 둘 모두)로는이 문제가 해결되지 않습니다. – MPT

+0

'XFlush'는'XTestFakeKeyEvent'를 실행 한 후 저를 고쳤습니다! 그것은 내가 완전히 놓친 견과를 몰고 있었다. 감사합니다 pzan! – Noitidart