Глобально скрывающий курсор (из фонового приложения) - PullRequest
8 голосов
/ 08 октября 2010

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

Глобально скрыть курсор мыши в Какао / Углерод? или 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 Ответ

9 голосов
/ 15 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...