2011-08-10 45 views
1

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

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

answer似乎是我最好的选择,但我无法得到它编译。具体来说,我得到:为i386硬件架构

未定义的符号: “_CGSDefaultConnection()”,从引用:在main.o中 _main “CGSSetConnectionProperty(INT,INT,__CFString常量*,__CFBoolean常量*)”,从引用: _main在main.o中

至于隐藏的指针,该代码,使用事件龙头,是到目前为止,我已经找到了最接近的事:

#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上仍然可以看到光标(最后我检查过)。

+2

你为什么要这样做? –

+0

允许这将会产生各种后果。没有丑陋的可能的越野车攻击,你将无法实现它。 –

+0

曾听说过Synergy?我想将鼠标三角洲转发到另一台计算机。控制另一台计算机时,让鼠标指针保持在屏幕上很难看。 – Luke

回答

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); 

这似乎是这样做的唯一途径。

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

+0

刚刚确认,这是任何人使用C++文件(即clang ++)编译而不是clang的正确方法。 –