2010-10-07 2 views
5

Je veux cacher le curseur d'une application de barre d'état et j'ai fait quelques recherches. Il semble que la solution à ce problème a été trouvé il y a un moment:Curseur globalement caché (de l'application de fond)

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

Mais le code qui est fait référence ne compilera pas. Est-ce que l'un d'entre vous sait comment compiler le code (en important une ancienne API ou quelque chose de ce genre) ou un autre moyen d'y parvenir (une sorte de hack)?

(je sais qu'il est généralement une mauvaise idée de cacher le curseur à partir d'une application de fond, mais je fait une application où cette fonctionnalité est assez essentiel)

Edit:

Voici le rosse ça ne marche plus.

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

Il me donne 4 erreurs:

"_CGSCreateBoolean", fait référence à partir de: - [MyClass myMethod] dans MyClass.o

"_GetSystemVersion", référencé à partir de: - [MyClass myMethod ] dans MyClass.o

"_CGSCreateCString", référencé à partir de: - [MyClass myMethod] dans MyClass.o

"_CGSReleaseObj", référencé à partir de: - [MyClass myMethod] dans MyClass.o

+0

S'il vous plaît modifier votre question pour inclure le code exact que vous utilisez et les erreurs que vous obtenez avec elle. –

Répondre

5

Vous devez établir un lien avec le cadre des services d'application pour se débarrasser des erreurs de liaison.

Voici un exemple complet du hack (mis à jour pour utiliser 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 

Sous Mac OS 10.5 ce cache le curseur jusqu'à ce que le programme est interrompu. Toutefois, l'exécution de n'importe quelle tâche de serveur de fenêtres ou de station d'accueil affiche le curseur.

+0

Merci beaucoup. fonctionne à merveille: D – Sorig

+0

J'ai corrigé la réapparition du curseur lors de l'exécution d'une tâche de serveur de fenêtres/dock en appelant un '-hideCursor' plusieurs fois en utilisant un' NSTimer'. Fonctionne même si l'application n'est pas au premier plan. – fabian789

+0

Quelqu'un sait pourquoi ce code rompt avec un compilateur C++? Cet exemple fonctionne très bien comme mentionné ci-dessus, mais en faisant "clang ++ -Cadre ApplicationServices tc" l'erreur suivante se produit: 'symboles indéfinis pour x86_64 architecture: "_CGSDefaultConnection()", fait référence à partir de: _main dans testCursor-p78PsB.o "CGSSetConnectionProperty (int, int, __CFString const *, __CFBoolean const *)", référencé à partir de: _main dans testCursor-p78PsB.o ld: symbole (s) non trouvé pour l'architecture x86_64 clang: erreur: commande de liaison a échoué avec exit code 1 (utilisez -v pour voir l'invocation) ' –