2010-10-07 9 views
5

Quiero ocultar el cursor de una aplicación de la barra de estado y he realizado algunas investigaciones. Parece que se ha encontrado la solución a este problema hace un tiempo:Cursor de ocultación global (desde la aplicación de fondo)

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

Pero el código que se conoce no se compilará. ¿Alguno de ustedes sabe cómo hacer que el código compile (mediante la importación de alguna API antigua o algo así) u otra forma de lograr esto (algún tipo de truco)?

(sé que es generalmente una mala idea para ocultar el cursor desde una aplicación de fondo, pero haciendo una aplicación donde esta funcionalidad es bastante esencial)

Editar:

Aquí está el viejo truco , eso ya no funciona.

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); 
} 

Me da 4 errores:

"_CGSCreateBoolean", se hace referencia a partir de: - [MiClase myMethod] en MyClass.o

"_GetSystemVersion", hace referencia a partir de: - [MiClase myMethod ] en MyClass.o

"_CGSCreateCString", hace referencia a partir de: - [MiClase myMethod] en MyClass.o

"_CGSReleaseObj", hace referencia a partir de: - [MiClase myMethod] en MyClass.o

+0

Por favor, edite su pregunta para incluir el código exacto que está utilizando y los errores que obtiene con él. –

Respuesta

5

es necesario enlazar contra el marco de servicios de aplicaciones para deshacerse de los errores de enlace.

Aquí está un ejemplo completo de la corte (actualizado para utilizar Fundación Core):

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 

En Mac OS 10.5 Esto oculta el cursor hasta que se interrumpió el programa. Sin embargo, la ejecución de cualquier servidor de ventana o tareas de acoplamiento muestra el cursor.

+0

Muchas gracias. funciona maravillosamente: D – Sorig

+0

He arreglado la reaparición del cursor al realizar una tarea de servidor/base de ventana llamando a '-hideCursor' repetidamente usando' NSTimer'. Funciona incluso si la aplicación no está en primer plano. – fabian789

+0

¿Alguien sabe por qué se rompe este código al usar un compilador de C++? Este ejemplo funciona bien como se mencionó anteriormente, pero cuando se hace "sonido metálico ++ -framework ApplicationServices tc" se produce el error siguiente: 'símbolos no definidos para la arquitectura x86_64: "_CGSDefaultConnection()", se hace referencia a partir de: _main en testCursor-p78PsB.o "CGSSetConnectionProperty (int, int, __CFString const *, __CFBoolean const *)", se hace referencia a partir de: _main en testCursor-p78PsB.o ld: símbolo (s) no encontrado para la arquitectura x86_64 sonido metálico: error: comando enlazador falló con código de salida 1 (use -v para ver la invocación) ' –

Cuestiones relacionadas