गैर-जावास्क्रिप्ट तरीका
दरअसल, मुझे समाधान पसंद हैं, जो जावास्क्रिप्ट पर आधारित हो सकते हैं, क्योंकि वे अधिक संभावना वेब से संबंधित हैं, और अच्छे मौके हैं - ओएस-स्वतंत्र। हालांकि, मैं इस बारे में सोच रहा था - जावास्क्रिप्ट समाधान के बाद से सभी ब्राउज़रों के लिए अपने मुद्दे को कैसे हल किया जाए, इस मामले में, सभी संभव ब्राउज़रों के लिए समायोजित करना मुश्किल होगा (मुझे यकीन नहीं है कि यह बिल्कुल संभव है)।
इसलिए, जैसा कि आपने उल्लेख किया है, एक और तरीका है - यानी ओएस स्तर पर व्यवहार का अनुकरण करने के लिए। इसका एक और फायदा भी है - आप सुनिश्चित हो सकते हैं कि ब्राउज़र के लिए यह 100% दिखता है क्योंकि यह मानव था (क्योंकि, ठीक है, यह ड्राइवर है जो सिग्नल भेज रहा है)। तो आप किसी भी ब्राउज़र के साथ ड्राइवर / डिवाइस-आधारित समाधान का उपयोग कर सकते हैं (या स्थिति में भी, जब जावास्क्रिप्ट अक्षम हो)।
लिनक्स
दुर्भाग्य से, ड्राइवर / डिवाइस को शामिल करने से तुरंत ओएस निर्भरता हो जाती है। इसलिए प्रत्येक OS के लिए आपको स्वयं के समाधान की आवश्यकता होगी। इस पोस्ट में मैं लिनक्स-आधारित समाधान पर ध्यान केंद्रित कर रहा हूं (इसलिए, लिनक्स के साथ काम करूंगा) - और मैक ओएस थोड़ा। लिनक्स के साथ, घटनाओं को स्पष्ट रूप से डिवाइस में लिखना संभव है, इसलिए नीचे मुख्य लूप के साथ फ़ंक्शन का नमूना है:
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 डेमो (कम फ्रेम दर, दुर्भाग्य से, इसलिए छवि को बहुत बड़ा नहीं रखें) यहां ।
थोड़ा साइड नोट (यदि आपको नहीं पता कि सी कोड के साथ क्या करना है) - ऊपर दिए गए प्रोग्राम को संकलित करने के लिए, बस उपयोग करें:
user@host:/path$ gcc -std=gnu99 file.c -o m
जहां file.c
आपकी सी स्रोत कोड फ़ाइल का नाम है, तो आपको निष्पादन योग्य मिलेगा, जिसे m
आपकी निर्देशिका में बुलाया जाएगा । सबसे अधिक संभावना है कि आपको सीधे माउस डिवाइस में लिखने की अनुमति चाहिए, ताकि आप उपयोग कर सकें sudo
:
user@host:/path$ sudo ./m
अन्य OS
तर्क वही रहेगा:
- अपने माउस डिवाइस को एक्सेस करने का तरीका खोजें
- मूविंग माउस की घटना लिखें
- अपने ईवेंट में यादृच्छिकरण लागू करें
बस। उदाहरण के लिए, मैक ओएस में माउस के साथ काम करने का अपना तरीका है (लिनक्स की तरह नहीं, मैक procfs
उतना अच्छा नहीं है ), यह यहाँ अच्छी तरह से वर्णित है ।
एक निष्कर्ष के रूप में
क्या बेहतर है - जावास्क्रिप्ट या डिवाइस-उन्मुख समाधान - आप पर निर्भर है, क्योंकि कुछ स्थिति (जैसे क्रॉस-ब्राउज़र या क्रॉस-ओएस) इस मामले में सब कुछ तय कर सकती है। इसलिए, मैंने ओएस स्तर पर इसे लागू करने के कुछ निश्चित उदाहरणों के साथ दिशानिर्देश प्रदान किए हैं। यहां लाभ यह है कि समाधान क्रॉस-ब्राउज़र है, लेकिन लागत के रूप में हमारे पास ओएस-बाइंडेड प्रोग्राम है।