Я разрабатываю расширение для MATLAB's PsychToolbox, которое позволяет лучше контролировать мышь во время психофизических экспериментов (в частности, не позволяя границам экрана ограничивать операции перетаскивания ... должно быть ощущение, что вы можете перемещать мышь «бесконечно» в все направления). Поскольку MATLAB не поддерживает создание дополнительных потоков (а в любом случае это было бы слишком сложно для этой ситуации), я не могу использовать ни менеджеры событий Carbon, ни Cocoa.
CGGetLastMouseDelta почти идеально подходит для того, что мне нужно сделать (оно дает мне сумму, на которую мышь переместилась " с момента последнего события перемещения мыши, полученного приложением ", игнорирующего границы экрана), однако есть небольшая проблема При программном перемещении мыши (с использованием CGWarpMouseCursorPosition или CGDisplayMoveCursorToPoint) события не генерируются. Следовательно, CGGetLastMouseDelta, похоже, не знает, что мышь вообще двигалась. Другими словами, если я перемещаю мышь на 50 пикселей и 50 пикселей вниз программно, CGGetLastMouseDelta возвращает (0, 0) впоследствии для дельты мыши. Это нежелательное поведение в моем контексте и требует безобразных обходных путей. Я пытался двигать мышь, публикуя события через систему событий, как показано ниже (это «mexFunction», способ вызова кода на языке MATLAB):
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
CGEventRef event;
CGPoint offset;
CGPoint currentLocation;
CGPoint newLocation;
if (nrhs != 2)
mexErrMsgTxt("The global x and y coordinates (and only those) must be supplied.");
event = CGEventCreate(NULL);
currentLocation = CGEventGetLocation(event);
CFRelease(event);
offset = CGPointMake((CGFloat) mxGetScalar(prhs[0]), (CGFloat) mxGetScalar(prhs[1]));
newLocation = CGPointMake(currentLocation.x + offset.x, currentLocation.y + offset.y);
event = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, newLocation, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);
}
Это радостно перемещает мышь, но, похоже, совсем не меняет поведение CGGetLastMouseDelta. Кто-нибудь знает точные спецификации относительно того, что возвращается CGGetLastMouseDelta (и когда?). Документация Apple по этому материалу (ссылка на Quartz), как обычно, близка к бесполезной (или, по крайней мере, не хватает необходимых деталей).
Спасибо!