2010-12-13 11 views
1

空の赤い矩形があり、マウスが矩形の上半分の枠を移動するたびにカーソルが閉じた簡単なアプリケーションを作成しようとしています。NSViewでマウス移動イベントが検出されない

私は、透明なNSWindowを作り、矩形でそれにNSViewを埋め込みました。マウスで移動したイベントを受け入れるためのウィンドウを作成しました(方法:-setAcceptsMouseMovedEvents)。私は-canBecomeKeyWindow-canBecomeMainWindowのウィンドウをオーバーライドしてYESを返しました。しかし、何とか-mouseMovedイベントのどれもがNSViewによって受信されていません。

ココアアプリケーションプロジェクトを作成し、-applicationDidFinishLaunchingメソッドでウィンドウを作成すると、私のビューは-mouseMovedイベントを受け取ることができました。

私はfoundationコマンドラインユーティリティプロジェクトを使用するとマウス移動イベントを受信しないのはなぜですか?

私は、Foundation cmdラインユーティリティプロジェクトを使ってウィンドウ(カーボンまたはココア)を作成するたびに、タイトルバーをクリックしてもウィンドウがキーにならないことも観察しました。タイトルバーの色をクリックすると、暗い灰色になる。なぜこうなった?

私は-canBecomeKeyWindow-canBecomeMainWindowNSwindowに置き換えてYESを返しました。

答えて

3

プログラムがNSApplicationを開始しないため、イベントを検出してウィンドウに渡すイベントループはありません。典型的なCocoaアプリケーションのmain.mファイルを参照してください。

このアプローチをとることで、達成しようとしていることを説明すると役に立ちます。私の推測では、デーモンを構築していますが、そうでなければ "ヘッドレス"デーモンを管理するGUIインターフェースが必要です。つまり、新しいログイン管理システムを構築しています。いずれの場合も、両方を行う特定の方法がありますが、これはそうではありません。 :-)

+0

ジョシュアの私のビューは、mouseDownやmouseDraggedのような他のイベントを受け取ることができます。唯一の問題は、mousesMovedイベントを受信することです。 実際には、アプリケーションをCarbonからCocoaに移行する作業を進めています。インタフェースビルダーとnibファイルは、元のCarbonコードでは使用されていないため使用できません。 透明なキャプチャウィンドウを作成しようとしたときに、この問題が発生しました。マウスポインタを四角形の境界線の上に移動させると、マウスポインタがclosedHandカーソルに変わり、ユーザがウィンドウを移動できることが示されます。 –

+0

あなたは、「タイトルバーの色をクリックすると、暗い灰色に変わるのではなく、明るい灰色のままです。問題は残っています。つまり、ウィンドウサーバーと正しくインターフェイスしていません。コマンドラインツールは、これを行うためのものではありません。私はあなたが新しい、通常のCocoaアプリケーションを作成し、適切なCocoaデザインパターンを使用してアプリケーションを再構築するほうがはるかに優れていることをさらに助言したいと思います。あなたは、既存のコードをコマンドラインプログラムのスリルで叩くことによって、Carbonアプリケーションのまっすぐな「ポート」をしようとする苦痛の世界*を求めています。これは悪いアドバイスより悪いです。 –

13

私はJoshuaがすでに言っていることに同意します。面倒なバックグラウンドプロセスやDockに表示されるユーザーインターフェイスを表示するアプリケーションは、Foundationツールテンプレートのような単純な古いMach-O実行可能ファイルではなく、アプリケーションバンドルの形式でなければなりません作成します。

はまた、ビューはデフォルトでmouseMoved:イベントに応答しない理由があります。

  1. マウスmouseMoved:を使用する理由はほとんどトラッキングエリアとして、一般的にあるイベントはすぐにイベントキュー
  2. をあふれさせることができます移動しましたはるかに効果的かつ効率的です です。 、1000回のイベントでは約20秒の結果のために上図の周りにマウスを移動

    alt text

Aは戻っている間、私はこれらの2つのアプローチの違いを示して少しテストアプリケーションを書きましたトラッキングエリアを使用する下側のビューでは50未満です。

サンプルGitHubのプロジェクト:https://github.com/NSGod/MouseMoved-vs-TrackingAreas

ヨシュアが述べたように、あなたが達成しようとしているかを説明することができればここでも、それが参考になります。あなたのアプリがバックグラウンドアプリ(LSUIElement == 1)で、Dockに表示されずにインターフェースを表示する必要がある場合は、その方法があります(Joshが述べたように、コマンドラインのバンドルされていないアプリは方法)。

+0

サンプルコードをお寄せいただきありがとうございます。 – gtmtg

関連する問題