在OS X中隐藏鼠标指针或块移动

时间:2011-08-10 01:01:50

标签: objective-c cocoa macos

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

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

answer似乎是我最好的选择,但我无法编译。具体来说,我得到:

架构i386的未定义符号:   “_CGSDefaultConnection()”,引自:       _main在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);
}

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

修改

为什么我要这样做?我正在录制鼠标增量来控制网络上的另一台计算机。 Synergy和Teleport等应用程序执行此操作,但在Synergy上仍然可以看到光标(最后我检查过)。

1 个答案:

答案 0 :(得分:4)

我找到了一种方法来进行answer编译。事实证明,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);

这似乎是唯一的方法。

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