【问题标题】:Hide mouse pointer or block movement in OS X在 OS X 中隐藏鼠标指针或阻止移动
【发布时间】:2011-08-10 01:01:49
【问题描述】:

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

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

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

架构 i386 的未定义符号: “_CGSDefaultConnection()”,引用自: main.o 中的 _main “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 上的光标仍然可见(我上次检查过)。

【问题讨论】:

  • 允许这样做会产生各种后果。如果没有丑陋且可能有漏洞的 hack,您将无法实现它。
  • 听说过 Synergy 吗?我想将鼠标增量转发到另一台计算机。在控制另一台计算机时让鼠标指针停留在屏幕上很丑。

标签: objective-c cocoa macos


【解决方案1】:

我找到了一种方法来编译这个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);

这似乎是唯一的方法。

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

【讨论】:

  • 刚刚确认,对于使用 c++ 文件(即 clang++)而不是 clang 进行编译的任何人来说,这是正确的方法。
猜你喜欢
  • 2020-12-04
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多