2010-10-07 28 views
5

İmleci bir durum çubuğu uygulamasından gizlemek istiyorum ve biraz araştırma yaptım. Bu sorunun çözümü bir süre önce bulunmuştur sanki görünüyor:Küresel olarak imleci gizleme (arka plan uygulamasından)

Globally hide mouse cursor in Cocoa/Carbon? veya

http://lists.apple.com/archives/carbon-dev/2006/Jan/msg00555.html Ama anılır kod derlemek olmaz. Sizden herhangi birini kodun nasıl derleneceğini (eski API veya bir şeyleri ithal ederek) veya bunu gerçekleştirmenin başka bir yolunu (bir çeşit kesmek) biliyor musunuz?

(Ben genellikle arka plan uygulamasından imleci gizlemek için kötü bir fikir olduğunu biliyorum, ama bu işlev oldukça önemlidir bir uygulamayı yapma)

Düzenleme:

İşte eski beygir Bu artık işe yaramıyor. [Sınıfım myMethod - : MyClass.o

başvurulan "_GetSystemVersion", içinde [Sınıfım myMethod] - :

"_CGSCreateBoolean", başvurulan:

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

Bana 4 hatalar veriyor

MyClass.o içinde [sınıfı bir myMethod] - :] MyClass.o

"_CGSCreateCString", in başvuruda dan başvurulan

"_CGSReleaseObj",: - MyClass.o

+0

Lütfen sorunuzu, kullanmakta olduğunuz kodu ve beraberindeki hataları eklemek için düzenleyin. –

cevap

5

yılında [Sınıfım myMethod] Sen bağlayıcı hataları kurtulmak için Uygulama Hizmetleri çerçevesinde karşı bağlamanız gerekir.

İşte (Çekirdek Foundation kullanmak güncellendi) hack tam bir örnek: Program kesilene kadar Mac OS 10.5 On

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 

bu imleci gizler. Ancak, herhangi bir pencere sunucusu veya yerleştirme görevleri gerçekleştirmek imleci gösterir.

+0

Çok teşekkürler. güzel çalışır: D – Sorig

+0

Bir "NSTimer" kullanarak art arda bir '-hideCursor 'çağırarak bir pencere sunucusu/yerleştirme görevi gerçekleştirirken imlecin yeniden ortaya çıkmasını düzelttim. Uygulama ön planda olmasa bile çalışır. – fabian789

+0

Bir C++ derleyicisi kullanırken bu kodun neden kırıldığını bilen var mı? yaparken Bu örnek, yukarıda belirtildiği gibi iyi çalışır, ancak "çınlama ++ -Çerçeve ApplicationServices tc" aşağıdaki hata oluşur: 'Tanımsız mimari x86_64 için semboller: testCursor-p78PsB.o içinde _main: başvurulan "_CGSDefaultConnection()", testCursor-p78PsB.o ld içinde _main: başvurulan "CGSSetConnectionProperty (int, int, __CFString const *, __CFBoolean const *)", sembol (ler) mimarisi x86_64 clang bulunamadı: hata: bağlayıcı komutu ile başarısız oldu çıkış kodu 1 (çağırma görmek için -v kullanın) ' –