3

私は現在、Windows から OSX にアプリケーション (より正確には VST プラグイン) を移植しています。OSXプログラミングは初めてですが、HICocoaCreateViewを使用して(ホストから取得した)Carbonウィンドウに追加されたCocoa NSViewを使用しています。

Anywhoo ...このビュー内でmouseMovedおよびmouseDraggedイベントを取得したいのですが、ドラッグすると、マウスがNSView(および親ウィンドウ)を離れてもこれらのイベントを取得したいのですが、作成できないようですこれが起こります。

Windows では、しばらくの間すべてのマウス イベントを取得するために、mouseDown で SetCapture を実行します。私が Cocoa で見つけた最も近いものは「addGlobalMonitorForEventsMatchingMask」ですが、これは 10.6+ のみであり、これがそれ以前にはできなかったものであるとは信じがたいです。(結局のところ、これはスクロールバーなどのドラッグ可能なコンポーネントによく使用されるものです。)

これは私を狂わせています!

アップデート:

CGEventTapCreate と呼ばれるものもあり、乏しいドキュメントからわかる限り、addGlobalMonitor に似ていますが、Carbon にあります。Carbon と Cocoa がどのように相互に関係しているか、何がどこで機能しているかについては、正確にはわかりません。ココアがメインだけど使える?(ホストから取得したウィンドウは、Cocoa と Carbon の両方である可能性があります。実際にはすべて混乱しています。)

4

2 に答える 2

3

CGEventTapものは実際にはカーボンではありません。これは、Cocoa のサブフレームワークとして扱うことができる Quartz にあります (実際には、他のフレームワークの集合体にすぎません)。Carbon は、アプリケーションのプログラミングがほとんど C で行われていた Mac OS 9 と、Objective-C が使用されている Mac OS X との間の移行を容易にするために作成されたレガシー (および非推奨) フレームワークです。Apple が提供するすべての C 関数が Carbon というわけではありません。C を使用する最新のフレームワークとして、Quartz と Grand Central Dispatch がすぐに思い浮かびます (速度がわずかに優れていると思います)。

背景を整理したので、これらの関数は Cocoa コードで問題なく動作します。私が把握できる限りでは、addGlobalEventMonitor...sのaddLocalEventMonitor...Obj-C ラッパーにすぎませCGEventTapん。

CGEventTapは行く方法だと思います。それらのドキュメントはまばらですが、簡単です。このSOの質問に対するDave DeLongの回答は、あなたを正しい道に導くかもしれません。

于 2011-06-13T18:48:39.907 に答える
2

私はあなたがこのようなことをする必要があると思います...

EventHandlerRef     m_ApplicationMouseDragEventHandlerRef;          
EventHandlerRef     m_MonitorMouseDragEventHandlerRef;

{
    OSStatus ErrStatus;

    static const EventTypeSpec kMouseDragEvents[] =
      {
        { kEventClassMouse, kEventMouseDragged }
      };

    ErrStatus = InstallEventHandler(GetEventMonitorTarget(), NewEventHandlerUPP(MouseHasDragged), GetEventTypeCount(kMouseDragEvents), kMouseDragEvents, this, &m_MonitorMouseDragEventHandlerRef);

    ErrStatus = InstallApplicationEventHandler(NewEventHandlerUPP(MouseHasDragged), GetEventTypeCount(kMouseDragEvents), kMouseDragEvents, this, &m_ApplicationMouseDragEventHandlerRef);

    return true;
}

//implement these functions
OSStatus MouseHasDragged(EventHandlerCallRef inCaller, EventRef inEvent, void *pUserData){}

EventTypeSpecは移動するために更新/変更する必要があり、残りは同じである必要があります。これはカーボンコードです。ただし、クォーツデスクトップサービスも検討してください。

乾杯!

于 2011-06-13T17:26:29.427 に答える