1

GeekTool に似たアプリケーションを作成しています。GeekTool が内部でどのように機能するかはよくわかりませんが、見た目も動作も似ています。基本的に、画面全体をカバーする枠のないウィンドウがありますが、これは正常に機能します。現在、「kCGDesktopIconWindowLevel」レ​​イヤーにウィンドウがありますが、デスクトップ上の何も操作できません (ファイルの移動/開くなど)。このレベルの 1 層下にウィンドウがある場合 ( kCGDesktopIconWindowLevel-1 )、デスクトップとは対話できますが、自分のウィンドウとは対話できず、対話できる必要があります。とにかく、上のレイヤーからクリックを受け取ったり、下のレイヤーに送信したりできますか?

ところで、これを達成する方法についてより良いアイデアがあれば、この問題を回避できれば幸いです。

4

1 に答える 1

1

次のようなイベント タップを作成することをお勧めします (この回答から抜粋) applicationDidFinishLaunching:

CGEventMask emask;
CFMachPortRef myEventTap;
CFRunLoopSourceRef eventTapRLSrc;

// We only want one kind of event at the moment: Left mouse down
emask = CGEventMaskBit(kCGEventLeftMouseDown);

// Create the Tap
myEventTap = CGEventTapCreate (
    kCGSessionEventTap, // Catch all events for current user session
    kCGTailAppendEventTap, // Append to end of EventTap list
    kCGEventTapOptionListenOnly, // We only listen, we don't modify
    emask,
    &myEventTapCallback,
    NULL // We need no extra data in the callback
);

// Create a RunLoop Source for it
eventTapRLSrc = CFMachPortCreateRunLoopSource(
    kCFAllocatorDefault,
    myEventTap,
    0
);

// Add the source to the current RunLoop
CFRunLoopAddSource(
    CFRunLoopGetCurrent(),
    eventTapRLSrc,
    kCFRunLoopDefaultMode
);

通常はマウスイベントを無視するようにウィンドウを設定します -[myWindow setIgnoresMouseEvents: YES];

次に、イベントタップは、「キャッチ」したいマウスクリックを探します-次のようなものです:

static CGEventRef myEventTapCallback (
    CGEventTapProxy proxy,
    CGEventType type,
    CGEventRef event,
    void * refcon
) {
    CGPoint mouseLocation;

    // If we would get different kind of events, we can distinguish them
    // by the variable "type", but we know we only get mouse moved events

    mouseLocation = CGEventGetLocation(event);

    // Figure out if the mouse is clicking on something we want to "catch"
    if (/* want this click */)
       [myWindow setIgnoresMouseEvents: NO];

    // Pass on the event, we must not modify it anyway, we are a listener
    return event;
}

マウス イベントが完了したら、マウス イベントを無視するようにウィンドウを戻します。

于 2012-11-30T20:36:04.663 に答える