मैं सभी आने वाली कुंजी दबाए गए ईवेंट रिकॉर्ड करना चाहता हूं इससे कोई फर्क नहीं पड़ता कि विंडो किस फोकस में है या पॉइंटर कहां है।एक्स कुंजीपटल/रिलीज इवेंट्स फोकस में विंडो के बावजूद कैप्चरिंग
मैंने एक नमूना कोड लिखा है जो फोकस में वर्तमान विंडो की प्रमुख दबाए गए ईवेंट को कैप्चर करना चाहिए।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <locale.h>
#include <stdint.h>
#include <stdarg.h>
#include <errno.h>
#include <pthread.h>
#include <X11/Xlib.h>
#include <X11/Xos.h>
#include <X11/Xfuncs.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
int _invalid_window_handler(Display *dsp, XErrorEvent *err) {
return 0;
}
int main()
{
Display *display = XOpenDisplay(NULL);
int iError;
KeySym k;
int revert_to;
Window window;
XEvent event;
Time time;
XSetErrorHandler(_invalid_window_handler);
XGetInputFocus(display, &window, &revert_to);
XSelectInput(display, window, KeyPressMask | KeyReleaseMask);
iError = XGrabKeyboard(display, window,
KeyPressMask | KeyReleaseMask,
GrabModeAsync,
GrabModeAsync,
CurrentTime);
if (iError != GrabSuccess && iError == AlreadyGrabbed) {
XUngrabPointer(display, CurrentTime);
XFlush(display);
printf("Already Grabbed\n");
} else if (iError == GrabSuccess) {
printf("Grabbed\n");
}
while(1) {
XNextEvent(display,&event);
switch (event.type) {
case KeyPress : printf("Key Pressed\n"); break;
case KeyRelease : printf("Key Released\n"); break;
case EnterNotify : printf("Enter\n"); break;
}
}
XCloseDisplay(display);
return 0;
}
मैं आवेदन जो खिड़की बनाई कीबोर्ड की घटनाओं को पहले से ही पकड़ लिया हो सकता है के रूप में कुंजीपटल पर कब्जा करने के XGrabKeyboard बोल रहा हूँ। उपर्युक्त कोड के साथ मैं कीबोर्ड को पकड़ने में सक्षम हूं लेकिन कीबोर्ड लूप के अंदर कीबोर्ड पर किसी भी कुंजी के लिए कुंजीपटल या कीरलीज़ इवेंट्स प्राप्त करने में असमर्थ हूं। क्या ऐसी कोई चीज है जिसे मैं कोड में याद कर रहा हूं जिसके कारण मैं घटनाएं प्राप्त करने में असमर्थ हूं? किसी भी सहायताको बहुत सराहा जाएगा।
मेरा अंतिम उद्देश्य विंडो पर ध्यान केंद्रित करने के बावजूद स्क्रीन पर महत्वपूर्ण प्रेस ईवेंट कैप्चर करना है। कोड को पठनीय करने के लिए मैंने फोकस में केवल विंडो के लिए नमूना कोड दिया है। मैं सभी विंडोज़ प्राप्त करने के लिए XQueryTree करता हूं और अपेक्षित परिणाम प्राप्त करने के लिए ऊपर दिए गए एक ही तर्क को लागू करता हूं।
क्यों तो घटना सबसिस्टम का उपयोग नहीं? –
क्या आप घटना उपप्रणाली पर विस्तृत जानकारी दे सकते हैं? मैंने XSelectInput पर कॉल में कैप्चर करने के लिए ईवेंट के रूप में KeyPressMask, KeyReleaseMask दिया है। धन्यवाद –
इग्नासिओ वाज़्यूज़-एब्राम लिनक्स कर्नेल इनपुट उपप्रणाली को संदर्भित करता है, जो '/ dev/input /' में वर्ण उपकरणों के माध्यम से सुलभ है। यह एक्स को पूरी तरह से बाईपास करता है, और सीधे एचआईडी घटनाओं को कर्नेल से प्राप्त करता है - लेकिन रूट विशेषाधिकारों की भी आवश्यकता होती है। –