Глобально скрывающий курсор (из фонового приложения)

Я хочу, чтобы скрыть курсор от приложения строки состояния, и я провел некоторое исследование. Кажется, что решение этой проблемы было найдено некоторое время назад:

Глобально скрыть курсор мыши в Какао / Карбон? или 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 myMethod] в MyClass.o

"_GetSystemVersion", на которую ссылаются из: -[MyClass myMethod] в MyClass.o

"_CGSCreateCString", на которую ссылаются из: -[MyClass myMethod] в MyClass.o

"_CGSReleaseObj", на которую ссылаются: -[MyClass myMethod] в MyClass.o

1 ответ

Решение

Чтобы избавиться от ошибок компоновщика, необходимо создать ссылку на платформу 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 это скрывает курсор, пока программа не будет прервана. Однако при выполнении любых задач оконного сервера или дока курсор отображается.

Другие вопросы по тегам