Скрыть указатель мыши или движение блока в OS X - PullRequest
1 голос
/ 10 августа 2011

Я хочу скрыть указатель мыши или предотвратить его глобальное перемещение в фоновом приложении.

Я пробовал "CGDisplayHideCursor (kCGDirectMainDisplay);", но, похоже, это работает только с приложениями переднего плана.

Этот ответ кажется моим лучшим выбором, но я не могу его скомпилировать. В частности, я получаю:

Неопределенные символы для архитектуры i386: "_CGSDefaultConnection ()", на которую ссылаются из: _main in main.o "CGSSetConnectionProperty (int, int, __CFString const *, __CFBoolean const *)", на который ссылаются из: _main in main.o

Что касается сокрытия указателя, этот код, использующий Event Taps, является самым близким, что я нашел до сих пор:

#include <ApplicationServices/ApplicationServices.h>

CGEventRef mouseEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
    if (type != kCGEventMouseMoved)
        return event;

    return NULL;
}

int main(void)
{
    CFMachPortRef mouseEventTap;
    CFRunLoopSourceRef mouseRunloop;

    mouseEventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0, (1 << kCGEventMouseMoved), mouseEventCallback, NULL);

    if(!mouseEventTap)
        exit(1);

    mouseRunloop = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, mouseEventTap, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), mouseRunloop, kCFRunLoopCommonModes);
    CGEventTapEnable(mouseEventTap, true);

    CFRunLoopRun();

    exit(0);
}

Приведенный выше код блокирует события движения мыши, поэтому другие приложения не реагируют на перемещение указателя над ними. Но это не мешает движению самого указателя.

EDIT

Почему я хочу это сделать? Я записываю дельты мыши, чтобы управлять другим компьютером по сети. Такие приложения, как Synergy и Teleport, делают это, но курсор по-прежнему виден в Synergy (последний раз, когда я проверял).

1 Ответ

4 голосов
/ 10 августа 2011

Я нашел способ сделать этот ответ скомпилированным.Оказывается, Synergy теперь скрывает курсор.

В заголовочном файле:

extern "C" {
     typedef int CGSConnectionID;
     CGError CGSSetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef value);
     int _CGSDefaultConnection();
}

Затем в исходном файле:

CFStringRef propertyString = CFStringCreateWithCString(NULL, "SetsCursorInBackground", kCFStringEncodingMacRoman);
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue);
CFRelease(propertyString);
CGDisplayHideCursor(kCGDirectMainDisplay);

Кажется, этоЕдинственный способ сделать это.

Мне было бы интересно узнать, есть ли лучший способ временно отключить мышь, но все же записать движение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...