2011-08-10 3 views
1

マウスポインタを隠したり、バックグラウンドアプリケーションでグローバルに動かないようにしたい。OS Xでマウスポインタやブロックの動きを隠す

"CGDisplayHideCursor(kCGDirectMainDisplay);"を試しましたが、これはフォアグラウンドアプリケーションでのみ機能するようです。

このanswerは私の最善の策だと思われますが、コンパイルすることはできません。 、 ")(_CGSDefaultConnection" をから参照:i386アーキテクチャ用

未定義のシンボル:具体的に私が手 "CGSSetConnectionProperty(int型、int型、__CFStringのconstが*、__CFBoolean CONST *)" から参照、main.oに _main :main.o

で _mainは限りポインタを隠すなど、イベントのタップを使用して、このコードは、私がこれまでに見つけた最も近いものです:

#include <ApplicationServices/ApplicationServices.h> 

CGEventRef mouseEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) 
{ 
    if (type != kCGEventMouseMoved) 
     return event; 

    return NULL; 
} 

int main(void) 
{ 
    CFMachPortRef mouseEventTap; 
    CFRunLoopSourceRef mouseRunloop; 

    mouseEventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0, (1 << kCGEventMouseMoved), mouseEventCallback, NULL); 

    if(!mouseEventTap) 
     exit(1); 

    mouseRunloop = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, mouseEventTap, 0); 
    CFRunLoopAddSource(CFRunLoopGetCurrent(), mouseRunloop, kCFRunLoopCommonModes); 
    CGEventTapEnable(mouseEventTap, true); 

    CFRunLoopRun(); 

    exit(0); 
} 

ブロックのマウス移動イベントを上記のコード他のアプリケーションはこれに応答しませんポインタがそれらの上を移動します。しかし、ポインタ自体の移動を妨げるものではありません。

EDIT

は、なぜ私はこれをしたいですか?私はネットワークデルタを記録して、ネットワーク上の別のコンピュータを制御しています。 SynergyやTeleportのようなアプリケーションではこれが行われますが、Synergyではカーソルが引き続き表示されます(最後にチェックしました)。

+2

なぜこれをやりたいですか? –

+0

これを許可すると、あらゆる種類の結果が生じるでしょう。あなたは醜いバグの可能性があるハックなしでそれを達成することができません。 –

+0

シナジーについて聞いたことがありますか?マウスデルタを別のコンピュータに転送したい。別のコンピュータを制御しながらマウスポインタを画面上に残すことは醜いです。 – Luke

答えて

4

私はこれを作る方法を見つけたanswerコンパイルします。 Synergyは今カーソルを隠していることが分かります。ヘッダファイルで

extern "C" { 
    typedef int CGSConnectionID; 
    CGError CGSSetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef value); 
    int _CGSDefaultConnection(); 
} 

は、その後、ソースファイルに:

CFStringRef propertyString = CFStringCreateWithCString(NULL, "SetsCursorInBackground", kCFStringEncodingMacRoman); 
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue); 
CFRelease(propertyString); 
CGDisplayHideCursor(kCGDirectMainDisplay); 

これはそれを行うための唯一の方法であると思われます。

私はマウスを一時的に無効にするより良い方法があるかどうか知ることに興味がありますが、まだ動きを記録しています。

+0

これは、clangではなくC++ファイル(clang ++)を使用してこれをコンパイルするすべての人にとって正しい方法です。 –

関連する問題