隐藏鼠标指针或阻止OS X中的移动

Luk*_*uke 2 macos cocoa objective-c

我想在后台应用程序中全局隐藏鼠标指针或防止其移动。

我已经尝试过“ CGDisplayHideCursor(kCGDirectMainDisplay);”,但这似乎仅适用于前台应用程序。

这个答案似乎是我最好的选择,但是我无法编译它。具体来说,我得到:

体系结构i386的未定义符号:“ _ CGSDefaultConnection()”,引用自:main.o中的_main“ CGSSetConnectionProperty(int,int,__CFString const *,__CFBoolean const *)”,引用自:main.o中的_main

就隐藏指针而言,使用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);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码阻止了鼠标移动事件,因此其他应用程序不响应在其上移动的指针。但这并不能阻止指针本身移动。

编辑

我为什么要这样做?我正在记录鼠标增量,以通过网络控制另一台计算机。诸如Synergy和Teleport之类的应用程序可以执行此操作,但是光标仍在Synergy上可见(我上次检查过)。

Luk*_*uke 5

我找到了一种编译此答案的方法。事实证明Synergy现在确实隐藏了光标。

在头文件中:

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

然后在源文件中:

CFStringRef propertyString = CFStringCreateWithCString(NULL, "SetsCursorInBackground", kCFStringEncodingMacRoman);
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue);
CFRelease(propertyString);
CGDisplayHideCursor(kCGDirectMainDisplay);
Run Code Online (Sandbox Code Playgroud)

这似乎是唯一的方法。

我想知道是否有更好的方法可以暂时禁用鼠标,但仍然记录运动。