私の目標は、現在のマウス位置を単純に返すプログラムを実装することです (ウィンドウを開かずに、何が実行されているかに関係なく)。これを検索した後、私が見つけた最も簡単で最も近い実装は、この種のことを行うための Python ライブラリであるautopyによるものでした。
現在のマウス位置を返す関数「get_pos()」。こちらのドキュメントを参照してください。「get_pos()」関数を独自に実装したいだけです (開発中のプログラムの autopy から含める必要があるのはそれだけだからです)。
github リポジトリで、autopy のソース コードを検索したところ、次の結論に達しました。「get_pos()」を呼び出すと、*mouse_get_pos 関数が発生します (完全なコードはこちらを参照してください)。
/* 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 関数を自分のシステムで適切に動作させて、自分のプログラムに実装できるようにするにはどうすればよいですか?
編集:「gcc mouse.c」を使用して単純に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
これにより、根本的な問題が明らかになりますか?