11

Mac OS でシステム全体のタッチ ジェスチャをプログラムで無効化/抑制する必要があります。スペース間の 4 本指スワイプなどのジェスチャについて言及しています。

私は EventTap を調べましたが、それはオプションではないようです (ここでの以前のレポートにもかかわらず、おそらく 10.8 で変更されています)。

また、システム設定をプログラムで変更するさまざまな方法を試しました。たとえば、IORegistryEntryCreateCFPropertiesを使用してサービスを見つけたサービスでIOConnectSetCFPropertiesを使用しようとしました。

また、トラックパッドの設定ペインを詳しく調べて、それらがどのように機能するかを確認し、それを再現しようとしました (作成/解放の不一致は無視してください。これは単なるテスト コードです)。

    NSInteger zero = 0;
    CFNumberRef numberWith0 = CFNumberCreate(kCFAllocatorDefault, kCFNumberNSIntegerType, &zero);

    CFMutableDictionaryRef propertyDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
                                                                    &kCFTypeDictionaryKeyCallBacks,
                                                                    &kCFTypeDictionaryValueCallBacks);

    CFDictionarySetValue(propertyDict, @"TrackpadFourFingerHorizSwipeGesture", numberWith0);

    io_connect_t connect = getEVSHandle(); // Found in the MachineSettings framework

    if (!connect)
    {
        NSLog(@"Unable to get EVS handle");
    }

    kern_return_t status = IOConnectSetCFProperties(connect, propertyDict);

    if (status != KERN_SUCCESS)
    {
        NSLog(@"Unable to get set IO properties");
    }

    CFRelease(propertyDict);
    CFPreferencesSetValue(CFSTR("com.apple.trackpad.fourFingerHorizSwipeGesture"), _numberWith0, kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);

    CFPreferencesSetValue(CFSTR("TrackpadFourFingerHorizSwipeGesture"), _numberWith0, CFSTR("com.apple.driver.AppleBluetoothMultitouch.trackpad"), kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);

    CFPreferencesSynchronize(kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);

    status = BSKernelPreferenceChanged(CFSTR("com.apple.driver.AppleBluetoothMultitouch.trackpad"));

この場合、機能しているように見え、エラーはなく、システム設定ペインでオプションが無効になりますが、4 本指のジェスチャーは引き続き機能します。ログアウトしてからログインすると効果があると思いますが、いずれにしても十分ではないため、試していません。

Pref ペイン自体も BSKernelPreferenceChanged を呼び出していることに注意してください。おそらくそれが問題の鍵です...

更新: 実際、私はそれを見つけてリンクしました。その呼び出しを追加しても違いはありませんが、エラーを示す可能性がある 1 が返されます。上記のコードに呼び出しを追加しました。

最後に、ターミナルからこれを試しました:

defaults write -globalDomain com.apple.trackpad.fourFingerHorizSwipeGesture 0
defaults write  com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadFourFingerHorizSwipeGesture 0

それもすぐに効果があるわけではありません。

これが不可能だとは思わない、方法があるに違いない...

MAS 互換性は必要ありません。

4

2 に答える 2

1

私もこれをやろうとしています。

イベントタップは機能しません。ファーストレスポンダーのビューもありません。

Apple ドキュメントから:

ただし、4 本指のスワイプなど、特定のシステム全体のジェスチャがあります。システムの実装は、アプリケーションが実行するジェスチャ処理よりも優先されます。

システム全体のジェスチャーを停止できた唯一の方法は、CGDisplayCapture. これにより、アプリケーションはすべてのイベントに排他的にアクセスできます...さらに、フルスクリーンの描画コンテキストにもアクセスできます。

おそらく、このモードに入ったときにクォーツ イベント サービスに対してどのような呼び出しが行われたかを確認することができます。

https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html

于 2012-12-13T15:30:15.833 に答える
0

タッチイベントを無効にするために間違った場所を見ていると思います。OSX (および他の多くのシステム) では、イベントを処理するビュー チェーンの最初のレスポンダーがイベントの伝播を停止します。処理するタッチ イベントごとに、ビューにイベント ハンドラーを記述する必要があります。それらが存在する場合、OS はイベントをファインダーまたはタッチを処理するために次に並んでいる他のアプリケーションに送信するのを停止します。イベント。

参照: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/EventOverview/HandlingTouchEvents/HandlingTouchEvents.html

具体的には: マルチタッチ イベントの処理 (setAcceptsTouchEvents を呼び出してから touches...WithEvent... を実装)

それが役立つことを願っています!

于 2012-12-07T16:51:14.527 に答える