全局隐藏光标(来自后台应用)

时间:2010-10-07 21:08:03

标签: objective-c cocoa macos

我想隐藏状态栏应用程序中的光标,我做了一些研究。好像很久以前就找到了这个问题的解决方案:

Globally hide mouse cursor in Cocoa/Carbon?http://lists.apple.com/archives/carbon-dev/2006/Jan/msg00555.html

但是引用的代码将无法编译。你们中的任何人都知道如何编译代码(通过导入一些旧的API或其他东西)或另一种实现这种方式(某种程度的黑客攻击)?

(我知道将光标隐藏在后台应用程序中通常是一个坏主意,但我制作的应用程序中此功能非常重要)

修改

这是旧的黑客,不再适用了。

long sysVers = GetSystemVersion();

// This trick doesn't work on 10.1 
if (sysVers >= 0x1020)
{
    void CGSSetConnectionProperty(int, int, int, int);
    int CGSCreateCString(char *);
    int CGSCreateBoolean(BOOL);
    int _CGSDefaultConnection();
    void CGSReleaseObj(int);
    int propertyString, boolVal;

    // Hack to make background cursor setting work
    propertyString = CGSCreateCString("SetsCursorInBackground");
    boolVal = CGSCreateBoolean(TRUE);
    CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, boolVal);
    CGSReleaseObj(propertyString);
    CGSReleaseObj(boolVal);
}

它给了我4个错误:

“_ CGSCreateBoolean”,引自: - MyClass.o中的[MyClass myMethod]

“_ GetSystemVersion”,引自: - MyClass.o中的[MyClass myMethod]

“_ CGSCreateCString”,引自: - MyClass.o中的[MyClass myMethod]

“_ CGSReleaseObj”,引自: - MyClass.o中的[MyClass myMethod]

1 个答案:

答案 0 :(得分:8)

您需要链接到Application Services框架以消除链接器错误。

以下是黑客的完整示例(更新为使用Core Foundation):

cat >t.c<<EOF
#include <ApplicationServices/ApplicationServices.h>

int main(void)
{
    void CGSSetConnectionProperty(int, int, CFStringRef, CFBooleanRef);
    int _CGSDefaultConnection();
    CFStringRef propertyString;

    // Hack to make background cursor setting work
    propertyString = CFStringCreateWithCString(NULL, "SetsCursorInBackground", kCFStringEncodingUTF8);
    CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue);
    CFRelease(propertyString);
    // Hide the cursor and wait
    CGDisplayHideCursor(kCGDirectMainDisplay);
    pause();
    return 0;
}
EOF
gcc -framework ApplicationServices t.c
./a.out

在Mac OS 10.5上,这会隐藏光标直到程序中断。但是,执行任何窗口服务器或停靠任务都会显示光标。