में वर्तमान माउस (पॉइंटर) स्थिति समन्वय कैसे प्राप्त कर सकता हूं यह या तो कुछ नमूना सी कोड या उपयोगिता हो सकती है जो मुझे या तो गुई या कंसोल पर दिखाएगी, इससे कोई फर्क नहीं पड़ता, लेकिन मुझे समन्वय को सटीक समय पर पकड़ने के लिए "कमांड" करने में सक्षम हो जो xev को बहुत उपयोगी नहीं बनाता है (जिसे मैं समझ सकता हूं)।मैं एक्स
मैं एक्स
उत्तर
मैं किसी भी माध्यम से सी प्रोग्रामर नहीं हूं लेकिन मैंने कुछ ऑनलाइन ट्यूटोरियल देखे और ऐसा लगता है कि आपको वर्तमान माउस स्थिति को कैसे पढ़ना है। यह मेरा स्वयं का कोड है और मैंने पहले एक्सलिब के साथ कुछ नहीं किया था, इसलिए इसे पूरी तरह से तोड़ दिया जा सकता है (उदाहरण के लिए, त्रुटि हैंडलर को हर त्रुटि के लिए कुछ भी नहीं करना चाहिए) लेकिन यह काम करता है। तो यहां एक और समाधान है:
#include <X11/Xlib.h>
#include <assert.h>
#include <unistd.h>
#include <stdio.h>
#include <malloc.h>
static int _XlibErrorHandler(Display *display, XErrorEvent *event) {
fprintf(stderr, "An error occured detecting the mouse position\n");
return True;
}
int main(void) {
int number_of_screens;
int i;
Bool result;
Window *root_windows;
Window window_returned;
int root_x, root_y;
int win_x, win_y;
unsigned int mask_return;
Display *display = XOpenDisplay(NULL);
assert(display);
XSetErrorHandler(_XlibErrorHandler);
number_of_screens = XScreenCount(display);
fprintf(stderr, "There are %d screens available in this X session\n", number_of_screens);
root_windows = malloc(sizeof(Window) * number_of_screens);
for (i = 0; i < number_of_screens; i++) {
root_windows[i] = XRootWindow(display, i);
}
for (i = 0; i < number_of_screens; i++) {
result = XQueryPointer(display, root_windows[i], &window_returned,
&window_returned, &root_x, &root_y, &win_x, &win_y,
&mask_return);
if (result == True) {
break;
}
}
if (result != True) {
fprintf(stderr, "No mouse found.\n");
return -1;
}
printf("Mouse is at (%d,%d)\n", root_x, root_y);
free(root_windows);
XCloseDisplay(display);
return 0;
}
दरअसल, xev बहुत उपयोगी है अगर आप इसे xwininfo का उपयोग करके खिड़की आईडी के साथ आपूर्ति करते हैं, तो यह आसानी से आपके लिए यह कार्य कर सकता है। इसमें कोई संदेह नहीं है कि बहुत अधिक सुरुचिपूर्ण समाधान हैं लेकिन यह काम करता है।
एक त्रुटि
root_windows = malloc(sizeof(Window) * number_of_screens);
बदलें कि यह करने के लिए इस लाइन पर नहीं है:
root_windows = (Window *)malloc(sizeof(Window) * number_of_screens);
खोजने की कोशिश कर रही है, दोनों लाइनें एएनएसआई-सी के साथ ठीक हैं कास्ट implicite है। लेकिन जीसीसी के लिए आप '-WC++ - compat -Werror' के साथ जमानत के लिए पहली पंक्ति बना सकते हैं। एक और कहानी यह है कि आप 'रूट_विंडोज़' को 'root_windows [i] 'को' XRootWindow (display, i) 'के साथ लूप में बदलकर पूरी तरह से छुटकारा पा सकते हैं। ;) – Tino
हो सकता है कि किसी को कुछ समय की बचत होगी: यह संकलन, pointerposition.c के तहत यह बचाने के लिए और चलाने के लिए: 'gcc pointerposition.c -o pointerposition -lX11' – exic
कुछ को यह जानने में उपयोगी हो सकता है: सक्रिय विंडो प्राप्त करने के लिए, आप 'विन्डो केंद्रित' का उपयोग कर सकते हैं; \t int revert_to; \t XGetInputFocus (डिस्प्ले, और फोकस, और revert_to); 'सक्रिय विंडो प्राप्त करने के लिए मैंने इस कॉल के साथ लूप को प्रतिस्थापित किया है, उदाहरण के लिए जो भी विंडो – user2255242