25

最近マジックマウスを購入しました。それは素晴らしく、可能性に満ちています。残念ながら、それはソフトウェア サポートによって深刻に妨げられています。私はそれを修正したい。私は非常に多くの調査を行ってきましたが、これまでのイベント チェーンに関する調査結果は次のとおりです。

  1. Magic Mouse は、完全なマルチタッチ イベントをシステムに送信します。
  2. マルチタッチ イベントは MultitouchSupport.framework (Carbon) で処理されます。
  3. イベントはフレームワークで解釈され、通常のイベントとしてシステムに送信されます
    • 1 本の指でスクロールすると、実際のスクロール ホイール イベントが送信されます。
    • 2 本の指でスワイプすると、スワイプ イベントが送信されます。
  4. NSTouch イベントはシステムに送信されません。NSTouch API を使用してマウスを操作することはできません。

上記のすべてを発見した後、MultitouchSupport.framework ファイルを逆アセンブルし、いくつかのグーグルで、独自のコールバックをチェーンに挿入して生のタッチ イベント データを受け取る方法を見つけました。デバイスのリストを列挙すると、デバイス (トラックパッドとマウス) ごとにアタッチできます。この発見により、マウスでマルチタッチを使用するためのフレームワークを作成できますが、これは単一のアプリケーションでのみ可能です。ここで私の投稿を参照してください: Raw Multitouch Tracking .

1つのアプリだけでなく、システム全体で新しい機能をマウスに追加したい。

そうしようとして、イベント タップを使用して、最下位レベルのイベント タップで生データを取得して解釈し、その場所に独自のイベントを送信できるかどうかを確認する方法を見つけました。残念ながら、そうではありません。イベント タップは、HID レベルであっても、入力が MultitouchSupport.framework で解釈されるよりも 1 ステップ上にあります。

ここで私のイベント タップ試行を参照してください: Event Tap - Attempt Raw Multitouch
興味深い補足: スワイプなどのマルチタッチ イベントを受信すると、デフォルトのケースがヒットし、イベント番号 29 が出力されます。ヘッダーには、28 が最大として表示されます。

私の質問に移ります。すべての情報を入手し、私が試したことを確認したところで、Magic Mouse の機能を拡張するための最良のアプローチは何でしょうか? 入力が処理されて事前定義されたイベントがディスパッチされる前に、入力を取得するのに十分な低レベルで何かを挿入する必要があることはわかっています。したがって、それを 1 文の質問に要約すると、次のようになります。

  • MultitouchSupport.framework で使用されるデフォルトのコールバックをオーバーライドする方法はありますか?
  • kext を作成し、すべての着信データを自分で処理する必要がありますか?
  • 現在入力を処理している kext の上にあるkext を作成し、その kext がすべてのハードワークを行った後にそれをフィルタリングすることは可能ですか?

私の最初の目標は、クリック時にデバイスに 2 本の指がある場合に、中ボタンのクリック イベントをディスパッチできるようにすることです。明らかに、できることははるかに多くありますが、今のところ、これは撮影するのに良いことのようです.

前もって感謝します!

-サスティラ

4

4 に答える 4

4

申し訳ありませんが、この回答を更新するのを忘れていましたが、 Quartz Event Servicesを介してユーザーランドからシステムにマルチタッチおよびジェスチャ イベントを挿入する方法を考え出しました。Lion の更新にどれだけ耐えられたかはわかりませんが、基になるソース コードはhttps://github.com/calftrail/Touchで確認できます。

これには 2 つのハックが必要です。プライベートMultitouch フレームワークを使用してデバイス入力を取得することと、文書化されていないCGEvent 構造を Quartz Event Services に挿入することです。どうやってそれをやってのけるかを理解するのは信じられないほど楽しかったですが、最近はMagic Trackpadを購入することをお勧めします:-P

于 2011-07-22T17:36:45.010 に答える
4

MultitouchSupport.framework で起こっていることは、Magic Mouse とガラスのトラックパッドでどのように異なりますか? IOKit デバイスのプロパティに基づいている場合、トラックパッドをエミュレートするが実際にはマウスと通信する KEXT が必要になると思います。Apple には、特に Darwin カーネル プログラミングとカーネル拡張に関するいくつかのドキュメントがあります。

(個人的には、ピンチ拡大と、より多くのスワイプ/ボタン ジェスチャを有効にするものが欲しいです。現状では、Magic Mouse は、Mighty Mouse の 4 つのボタンと [常に詰まっていますが] 2D スクロール ホイールからの機能的なダウングレードです。更新: 最後ちょうどそれを行うためにSesamouseを書いた年で、kextは必要ありません(16進ダンプを1週間か2週間見つめるだけです:-)ディーツとソースコードについては私の他の回答を参照してください。)

于 2009-11-04T22:59:32.653 に答える
3

ユーザー空間のカスタマイズ可能なマルチタッチ イベント ラッパーの概念実証を実装しました。

ここでそれについて読むことができます: http://aladino.dmi.unict.it/?a=multitouch ( WaybackMachineを参照)

- ではごきげんよう

于 2009-11-13T15:52:29.540 に答える
2

その点に到達した場合、中クリックはマウスの 2 本指ではなく 3 本指であると考えることができます。マジック マウスでのこのミドル クリックの問題について考えてみたところ、左クリックだけを押しているにもかかわらず、2 番目の指をマウスに置いたままにしていることがよくあることに気付きました。そのため、「2 本の指」でのクリックは 1 回の左クリックと間違えられる可能性があり、ユーザーは常にマウスから 2 本目の指を離さなければならないというより多くの労力を必要とします。したがって、検出が可能であれば、3 本の指で混乱や頭痛が軽減されます。最初の「中ボタンクリック」ソリューションはどこから来るのだろうかと思います.中クリックの公開機能が戻ってくることを切望しています:)頑張ってください。

于 2009-11-04T07:46:45.733 に答える