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