자바 스크립트 이외의 방법
사실, 나는 웹과 관련이 있고 OS와 무관 한 좋은 기회이기 때문에 자바 스크립트를 기반으로하는 솔루션을 좋아합니다. 그러나 자바 스크립트 솔루션은 가능한 모든 브라우저에 맞게 조정하기가 어려우므로 모든 브라우저에서 문제를 해결하는 방법에 대해 생각했습니다.
앞에서 언급했듯이 OS 수준에서 동작을 에뮬레이션하는 다른 방법이 있습니다. 이것은 또 다른 이점이 있습니다. 브라우저의 경우 사람처럼 100 % 보인다는 것을 확신 할 수 있습니다 (신호를 보내는 드라이버이기 때문에). 따라서 모든 브라우저에서 (또는 자바 스크립트가 비활성화 된 경우에도) 드라이버 / 장치 기반 솔루션을 사용할 수 있습니다.
리눅스
불행하게도, 드라이버 / 장치를 관련 시키면 즉시 OS 의존성이 발생합니다. 따라서 각 OS마다 고유 한 솔루션이 필요합니다. 이 포스트에서는 Linux 기반 솔루션 (Linux와 함께 작동)과 Mac OS에 중점을두고 있습니다. Linux를 사용하면 이벤트를 장치에 명시 적으로 작성할 수 있으므로 다음은 기본 루프가있는 함수 샘플입니다.
int main()
{
struct input_event event, event_end;
int fd = open("/dev/input/event4", O_RDWR);
long ma = getInteger("Enter max amplitude [points, 0..50]: ", 0, 50);
long ta = getInteger("Enter max wait time [usecs , 0..200000]: ", 0, 200000);
if (fd < 0)
{
printf("Mouse access attempt failed:%s\n", strerror(errno));
return -1;
}
memset(&event, 0, sizeof(event));
memset(&event, 0, sizeof(event_end));
gettimeofday(&event.time, NULL);
event.type = EV_REL;
gettimeofday(&event_end.time, NULL);
event_end.type = EV_SYN;
event_end.code = SYN_REPORT;
event_end.value = 0;
while(1)
{
event.code = rand() % 2 ? REL_X : REL_Y;
event.value = (rand() % 2 ? -1 : 1) * randomTill(ma);
write(fd, &event, sizeof(event));
write(fd, &event_end, sizeof(event_end));
usleep(randomTill(ta));
}
close(fd);
return 0;
}
문제에 대한 내 전체 코드 는 여기 에서 찾을 수 있습니다 . 이 프로그램은 "진동"의 진폭과 주파수를 요구할 것입니다 (따라서 "진동"사이의 시간은 마이크로 초 단위입니다). 상황을 에뮬레이트하기 위해 마우스가 0..X
임의의 방향으로 포인트를 무작위 로 움직이고 (왼쪽 아래로) 0..Y
다음 "떨림"까지 무작위로 마이크로 초를 기다리면 "진동"의 X
진폭이 있으며 "진동의 Y
빈도"입니다 "
또 다른 것은 시스템에 맞게 프로그램을 조정하는 것입니다. 이 프로그램은 "더미"이며 마우스 자체를 감지 할 수 없으므로 "/dev/input/event4"
하드 코드되어 있습니다. 시스템의 식별자가 무엇인지 인식하려면 다음을 시도하십시오.
user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3
H: Handlers=mouse1 event4
가능성은 그렇게 "event3"
하고 "event4"
-하지만 시스템에 다른 값을 가질 수. 따라서 현재 C 코드에서 사용되는 것과 다른 경우 해당 줄을 변경하십시오 (따라서 줄 int fd = open("/dev/input/event4", O_RDWR);
대신 장치를 배치하십시오 event4
)
이 프로그램에 대한 GIF 데모 (낮은 프레임 레이트는, 불행하게도, 너무 이미지가 너무 크지 유지) 여기를 .
약간의 참고 사항 (C 코드로 무엇을 해야할지 모르겠다면) — 위의 프로그램을 컴파일하려면 다음을 사용하십시오.
user@host:/path$ gcc -std=gnu99 file.c -o m
여기서 file.c
C 소스 코드 파일의 이름은 m
디렉토리에서 호출 된 실행 파일을 얻습니다 . 마우스 장치에 직접 쓸 수있는 권한이 필요할 가능성이 높으므로 다음을 사용할 수 있습니다 sudo
.
user@host:/path$ sudo ./m
다른 OS
논리는 동일하게 유지됩니다.
- 마우스 장치에 액세스하는 방법을 찾으십시오
- 마우스 이동 이벤트 쓰기
- 이벤트에 무작위 적용
그게 다야. 예를 들어, Mac OS에는 Linux와 달리 마우스를 사용하는 고유 한 방법이 있습니다 (Mac은 그렇지 않습니다 procfs
) . 여기에 잘 설명되어 있습니다 .
결론으로
특정 상황 (예 : 크로스 브라우저 또는 크로스 OS)이이 경우 모든 것을 결정할 수 있기 때문에 더 나은 것 (자바 스크립트 또는 장치 지향 솔루션)은 사용자에게 달려 있습니다. 따라서 OS 수준에서 구현하는 방법에 대한 특정 실례와 함께 지침을 제공했습니다. 여기서 이점은 솔루션이 크로스 브라우저이지만 비용에 따라 OS 바인딩 프로그램이 있다는 것입니다.