2

ココアでイベントをリッスンするために addGlobalMonitorForEventsMatchingMask を使用しています。

[NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDraggedMask 
                                       handler:^(NSEvent *event) {
    NSLog(@"Dragged...");
}];

ウィンドウをドラッグ/移動しているかどうかを知りたいのですが(つまり、どのウィンドウであるかを知りたいのですが、コマンドを押したままウィンドウをドラッグすると、私が知る限りフォーカスが得られませんが、フォーカスされたウィンドウを見つけることができます。)

では、ウィンドウをドラッグしているかどうかを検出できますか?

アップデート:

これでクラス " SATest : NSObject <NSWindowDelegate>" ができました。このクラスで windowDidMove メソッドを実装します (後でおそらく windowWillMove も実装します)。私の質問は次のとおりです。すべてのアプリのすべてのウィンドウにデリゲートをアタッチするにはどうすればよいですか?

更新 2:

画面上で開いているすべてのウィンドウのリストを見つけることができます。

AXUIElementRef _systemWideElement;
_systemWideElement = AXUIElementCreateSystemWide();

CFArrayRef _windows;
AXUIElementCopyAttributeValues(_systemWideElement, kAXWindowsAttribute, 0, 100, &_windows);

次に、ウィンドウを反復処理する必要があり、それぞれが NSWindow であるため、デリゲートを追加できます。[window setDelegate:self];

更新 3: 明確にするために、この質問は、すべてのアプリのすべてのウィンドウのドラッグの検出に関するものです。自分のアプリのウィンドウだけではありません。

また、私はこのイベントとウィンドウ管理については非常に新しいので、答えを短くする必要はありません。たくさん読んでうれしいです:P

ありがとう!-P

4

2 に答える 2

5

ウィンドウがドラッグされているかどうかを調べるには、 NSWindowDelegateプロトコルの次のメッセージに応答して、ウィンドウのデリゲートとして機能するオブジェクトが必要です。

  1. windowWillMove - ウィンドウが移動しようとしていることをデリゲートに伝えます。
  2. windowDidMove - ウィンドウが移動したことをデリゲートに伝えます。

これらのメソッドに送信される通知パラメータにobjectを送信することで、問題の NSWindow オブジェクトを取得できます。

例えば

NSWindow draggedWindow = [notification object];

詳細については、こちらをご覧ください

アップデート:

すべてのウィンドウについてこの情報を取得するという要求に応えて、NSApplicationクラスは、アプリケーションが所有するすべてのウィンドウの配列を返すメソッドを提供します。この情報を取得する一般的な方法は、NSApplicationDelegateメソッドの 1 つを使用して、アプリケーション オブジェクトへの参照を取得することです。

たとえば、アプリのデリゲート (疑似コード) では次のようになります。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSApplication * app = [aNotification object];
    // you now have a reference to your application.
    // and can iterate over the collection of windows and call
    // [window setDelegate:self]; for each window.
}

ウィンドウが追加および削除されると、デリゲートを追加または削除する必要があることに注意してください。これを行うための最良の方法は– applicationDidUpdate:です。

問題の解決を開始するには、これで十分です。

于 2012-06-09T18:43:10.323 に答える
1

Benjamin が提案したように、答えはアクセシビリティ API にあります。この質問をする前でさえ、私はこれをしばらく見回していましたが、私が望んでいたことをすることができませんでした. 私は今、かなり良い解決策を見つけました。

大まかに言えば、次のことを行います。

  1. マウス ダウン イベントを聞いて、クリックしたウィンドウとその場所の両方を覚えておいてください。
  2. マウスアップイベントをリッスンし、場所が変更されたかどうかを確認します。変更されている場合は、ウィンドウを移動したことがわかっています

サイズを変更したかどうかも知りたい場合は、サイズについて同様のことができます。より良い解決策があるかもしれませんが、何日も試してみた後、これが私が望むように動作させる唯一の方法でした.

これが似たようなものを探していた人に役立つことを願っています.

-パブロ

于 2012-06-20T08:59:18.800 に答える