현재 XKeysymToKeycode()
을 호출하고 대문자로 전달할 때마다 KeySym
이 소문자 인 KeyCode
을 반환하는 Xlib에 문제가 있습니다. 구글은 실제로이 질문에 대한 답이나 내가 사용하고있는 기능에 관한 많은 문서를 갖고 있지는 않다. 여기 XKeysymToKeycode()가 모든 키를 소문자로 만드는 이유는 무엇입니까?
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/extensions/XTest.h>
int main(void) {
Display *display;
char *ptr;
char c[2] = {0, 0};
KeySym ksym;
KeyCode kcode;
display = XOpenDisplay(0);
ptr = "Test";
while (*ptr) {
c[0] = *ptr;
ksym = XStringToKeysym(c);
printf("Before XKeysymToKeycode(): %s\n", XKeysymToString(ksym));
kcode = XKeysymToKeycode(display, ksym);
printf("Key code after XKeysymToKeycode(): %s\n", XKeysymToString(XKeycodeToKeysym(display, kcode, 0)));
ptr++;
}
XCloseDisplay(display);
return 0;
}
gcc -o sendkeys sendkeys_min.c -lX11 -lXtst -g -Wall -Wextra -pedantic -ansi
가 컴파일 할 수 있습니다
전류 출력은 다음과 같다 (이 sendkeys_min.c
로 저장 한 가정.) :
Before XKeysymToKeycode(): T
Key code after XKeysymToKeycode(): t
Before XKeysymToKeycode(): e
Key code after XKeysymToKeycode(): e
Before XKeysymToKeycode(): s
Key code after XKeysymToKeycode(): s
Before XKeysymToKeycode(): t
Key code after XKeysymToKeycode(): t
예상 출력은 물론 "Test"의 첫 번째 T가 XKeysymToKeycode()
을 통과 한 후에도 여전히 대문자임을 나타냅니다. (이것은 실제 프로그램이 아니라 여기에 게시 할 수있는 간소화 된 버전입니다. 실제 프로그램에서 결과 키 코드와 함께 키 이벤트를 보내고 보내지는 키가 여전히 여기에 표시되어 있습니다 (모두 소문자가됩니다))
좋아, 나에게 의미가있다. 그러나 문제는 원래 프로그램에서 KeyCode를 KeySym으로 다시 변환하지 않는다는 것이다.키 이벤트를 보내기 위해이 키 이벤트를 사용하고 키 이벤트를 보낼 때 키는 소문자로 전송됩니다. 그렇다면 내가 대문자가되기 원하는 키를 누르기 전에 Shift 키를 누르는 중요한 이벤트를 보내야한다고 가정합니다. – AppleDash
@AppleDash : 키 누름 이벤트를 제작하는 경우 최소한 (수정 자 키의 비트 마스크 포함) 이벤트 구조의 'state'멤버를 설정해야합니다. 대부분의 앱은 수정 자 키 누름과 해제에 신경 쓰지 않습니다. 솔직히 X의 내부 구조가 어떻게 처리되는지 모르겠습니다. 그래서 내 추측은 국가를 세우는 것만으로도 충분하지만, 그 기반을 다룰 실제적인 경험이 없다는 것입니다. – rici
좋아, 고마워. 너는 도움이되었다. – AppleDash