2013-09-18 3 views
-1

Моя цель - реализовать программу, которая просто возвращает текущую позицию мыши (без открытия каких-либо окон и независимо от того, что работает). После поиска этого, ближайшая и самая простая реализация, которую я смог найти, была через autopy, библиотеку python для такого рода вещей.Реализация части исходного кода c

Функция 'get_pos()', которая возвращает текущую позицию мыши. См. Документацию here. Я просто хочу реализовать функцию get_pos() самостоятельно (потому что это все, что мне нужно включить из автопиля для разрабатываемой программы).

В реестре github я просмотрел исходный код автокатастрофы, и я пришел к следующим выводам. Вызов 'get_pos() приводит к тому, * mouse_get_pos функцию, чтобы произойти (см полный код here):

/* Syntax: get_pos() => tuple (x, y) */ 
/* Description: Returns a tuple `(x, y)` of the current mouse position. */ 
static PyObject *mouse_get_pos(PyObject *self, PyObject *args); 

Эта функция, кажется, называют 'getMousePos':

static PyObject *mouse_get_pos(PyObject *self, PyObject *args) 
{ 
    MMPoint pos = getMousePos(); 
    return Py_BuildValue("kk", pos.x, pos.y); 
} 

, который расположен в заголовке mouse.c файл:

MMPoint getMousePos() 
{ 
#if defined(IS_MACOSX) 
    CGEventRef event = CGEventCreate(NULL); 
    CGPoint point = CGEventGetLocation(event); 
    CFRelease(event); 

    return MMPointFromCGPoint(point); 
#elif defined(USE_X11) 
    int x, y; /* This is all we care about. Seriously. */ 
    Window garb1, garb2; /* Why you can't specify NULL as a parameter */ 
    int garb_x, garb_y; /* is beyond me. */ 
    unsigned int more_garbage; 

    Display *display = XGetMainDisplay(); 
    XQueryPointer(display, XDefaultRootWindow(display), &garb1, &garb2, 
       &x, &y, &garb_x, &garb_y, &more_garbage); 

    return MMPointMake(x, y); 
#elif defined(IS_WINDOWS) 
    POINT point; 
    GetCursorPos(&point); 

    return MMPointFromPOINT(point); 
#endif 
} 

Этот код, кажется, включает в себя способ возвращения положения мыши во всех операционных системах, что я и пытаюсь реализовать в моем программа. Как я могу заставить эту функцию c работать должным образом в моей системе, чтобы я мог ее реализовать в своей программе?

EDIT: Я попытался просто компиляции mouse.c с помощью «GCC mouse.c», и я получаю эту ошибку:

Undefined symbols for architecture x86_64: 
    "_CFRelease", referenced from: 
     _moveMouse in ccVkh5f7.o 
     _getMousePos in ccVkh5f7.o 
     _toggleMouse in ccVkh5f7.o 
    "_CGEventCreate", referenced from: 
     _getMousePos in ccVkh5f7.o 
    "_CGEventCreateMouseEvent", referenced from: 
     _moveMouse in ccVkh5f7.o 
     _toggleMouse in ccVkh5f7.o 
    "_CGEventGetLocation", referenced from: 
     _getMousePos in ccVkh5f7.o 
    "_CGEventPost", referenced from: 
     _moveMouse in ccVkh5f7.o 
     _toggleMouse in ccVkh5f7.o 
    "_deadbeef_rand", referenced from: 
     _smoothlyMoveMouse in ccVkh5f7.o 
    "_getMainDisplaySize", referenced from: 
     _smoothlyMoveMouse in ccVkh5f7.o 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

ли это сделать какие-либо основные проблемы очевидны?

+0

mouse.c не является файлом заголовка. – Sebastian

+0

Вы хотите реализовать его в чистом питоне? Наверное, невозможно. Таким образом, вам понадобится компилятор C (или C++), скомпилируйте часть автозапуска, которая вам нужна, и интерфейс. Почему вы не можете использовать autopy, даже если вам не нужны все его функции? – Sebastian

+0

«Как я могу заставить эту функцию c правильно работать в моей системе, чтобы я мог ее реализовать в своей программе?» Какая у вас система? Что не работает должным образом? – Sebastian

ответ

1

Проблема на вашем Mac заключается в том, что вы компилируете код, который использует различные фреймворки, и вы не связываете эти фреймворки. _CFRelease происходит от CoreFoundation, _CGEventCreate от Quartz и т. Д.

Итак, вы не можете просто написать gcc mouse.c. Если вы пишете, скажем, gcc mouse.c -framework CoreFoundation, вы увидите, что некоторые ошибки исчезли. Если вы добавите все нужные флаги, вы увидите, что все они исчезли.

На Mac, предположительно, ваш mouse.c (или заголовок, который он использует) уже содержит файлы заголовков из этих фреймворков, или он даже не был скомпилирован, поэтому вы бы даже не получили эти ошибки компоновщика. В этом случае довольно легко угадать, какие рамки вам необходимо включить: #include <CoreFoundation/CoreFoundation.h> означает, что вам нужно -framework CoreFoundation.

Кроме того, вы можете просто найти документацию разработчика Apple для каждой из функций, которые не выполняются; в верхней части каждой страницы указывается, в какой структуре находится недостающая функция.

Возможно, есть другие вещи, которые вы хотите включить. Например, если вы хотите распространять двоичный файл, а не источник, который должен создать каждый пользователь, вы, вероятно, захотите построить против SDK, а не против локальных файлов.


Но вы собираетесь иметь точно такую ​​же проблему на любой другой платформе, так что вы будете иметь, чтобы решить там.И на других платформах нет фреймворков; нет однозначного сопоставления между заголовочными файлами и библиотеками -l на linux.

Очевидно, что autopy уже решил эту проблему, поэтому ее setup.py/configure/Makefile/whatever уже скажет вам все, что вам нужно связать на каждой платформе (хотя это может включать в себя целую кучу других вещей, которые вы не необходимо).


Последняя ошибка немного отличается. Жалоба на то, что вы не определили функцию main. Каждая программа C должна иметь функцию main. (Если вы пытаетесь построить статическую или динамическую библиотеку, а не программы, вы должны сказать GCC, чтобы сделать это.)


Here вы можете увидеть версию изрубил работать на OS X.

Смежные вопросы