7

イベントのリッスンに問題があります。完全に機能するイベントをリッスンできますが、イベントのリッスンを停止させることはできません。しばらく調べて、+(void)removeMonitor:(id)eventMonitorというメソッドを思いつきました。これは、リスナーを使い終わったら使用する必要があることを示しています。

しかし、私がその方法を使おうとすると、

[NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask|NSKeyDownMask) handler:^(NSEvent *event) {
    [NSEvent removeMonitor:event];
}];

「-[NSEventinvalidate]:認識されないセレクターがインスタンスに送信されました」というエラーが表示され続けます。これも調査しましたが、使用中のメモリを上書きしていることを意味していると思います。しかし、私はこの問題を解決する方法がわかりません。任意の提案、またはヘルプは大歓迎です!

更新JWWalker、Samir、Abizernのおかげで、動作するようになりました

//I made a global variable called eventHAndler

.hファイル

id eventHAndler

.mファイル

eventHAndler = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask|NSKeyDownMask) handler:^(NSEvent *event){
///code 
}];

/// created another method called stop. When called it stops the eventHAndler
- (IBAction)Stop:(id)sender 
{
    stop = 1;
    NSLog(@"inside stop method");
    [NSEvent removeMonitor:eventHAndler];
}
4

2 に答える 2

19

に間違ったものを渡していますremoveMonitor:。の呼び出し+[NSEvent addGlobalMonitorForEventsMatchingMask: handler:]は、イベントハンドラオブジェクトと呼ばれる値を返します。それがに渡されるものremoveMonitor:です。

于 2012-08-28T02:02:30.850 に答える
0

によると:http ://developer.apple.com/library/mac/#documentation/cocoa/conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html

彼らが言うには:

グローバルイベントモニターは、インストールされているアプリケーション以外のアプリケーションにディスパッチされたユーザー入力イベントを探します。モニター は、イベントを変更したり、通常の配信を妨げたりすることはできません。また、アクセシビリティが有効になっている場合、またはアプリケーションがアクセシビリティについて信頼されている場合にのみ、主要なイベントを監視できます。

だからそれは不可能だと彼自身は言う:P

于 2012-08-28T00:25:16.307 に答える