Macでどのプログラムがフォーカスを奪っているのかを検出する方法はありますか?


23

Mac上のキーボードフォーカスを盗むアプリで問題が発生しました(現在のウィンドウのタイトルバーが非アクティブになります)。ただし、実際には独自のウィンドウやメニューバーを表示することはなく、キーボードショートカットに識別可能な応答もしません。

メニューバーやDockアイコンがないアプリケーションの1つであっても、キーボードフォーカスがあるアプリケーションを判別する方法はありますか?私はこれをほとんど行う組み込み機能を知っています。強制終了ダイアログがキーボードから呼び出された場合、フォーカスされたアプリケーションが選択された状態で開きます。ただし、通常のhas-a-dock-iconアプリケーションのみがリストされるため、この場合は役に立ちません。

これは、10.8から10.9にアップグレードした頃に発生し始めました。OSと共に既にインストールまたはアップグレードしたアプリの1つが、新たに誤動作していると思われます。

私は、少量のプログラミング(またはAppleScriptなど)、開発者ツールの使用などを含むソリューションを受け入れています。「それが消えるまでアンインストールする」のようなものはそうではありません。アプリケーションを明確に識別し、バグレポートを提出するか、その構成を修正したいと思います。

私の研究では、回答が含まれていないApple Support Communitiesで同じことを要求するスレッドが2、3しか見つかりませんでした。


私もこれを見ています。10.9.4。おそらく、実行中のメインアプリを共有することで、共通点が浮かび上がるかもしれません。Chrome、Firefox、Safari、Wuala、Dropbox、Nitrous、1Password、Google Hangouts、Evernote、Skitch、Googleドライブ、Time Machine、Airport Base Station Agent、Android File Transfer Agent。そうでなければ...私が知っている簡単な解決策はありません。私の疑いはGハングアウトです。
JezC

回答:


21

次のコードをfind_focus_stealer.pyファイルに保存python find_focus_stealer.pyし、ターミナルで実行することにより、フォーカスを盗むアプリを見つけることができます。

スクリプトの実行を開始します。アクティブなアプリの名前が3秒ごとに出力されます。通常どおり作業を続け、問題が発生するまで待ち、数秒後にターミナルで出力を確認します。犯人がいます。

私の場合、それはSymantec Antivirusバックグラウンドアプリ(SymUIAgent.app)でした。

#!/usr/bin/python

from AppKit import NSWorkspace
import time
t = range(1,100)
for i in t:
    time.sleep(3)
    activeAppName = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationName']
    print activeAppName

クレジットiMichael_、このAppleのディスカッションスレッド


このスクリプトを試しました。奇妙なことに、イベントを盗むたびに、スクリプトの実行が停止します。ウィンドウ内の最後のログステートメントは、前のログステートメントと同じです。つまり、明らかな原因はありません。スクリプトは終了するだけで、エラーは発生しません。
Diodeus -ジェームズ・マクファーレン

2
このpythonプログラムは問題なく機能しましたが、Apple Installed Pythonを使用する必要がありました。Python 2.7.8をbrewインストールしましたが、AppKitモジュールは含まれていません。また、私のマシンでは、問題のアプリは SymUIAgent.app Symantec Quick Menuでした。
キャメロングッデール14

2
@Diodeusこれが終了する理由は、盗んだアプリがそれを終了したためではなく、これが100秒間だけ実行するように書かれているためです。そのターミナルウィンドウでCtrl + cを押すまで実行するように変更for i in t:しましたwhile 1:
-CenterOrbit

1
いいね!私にとっては、Google Drive.appでした。スクリプトを少し更新しましたが、別の回答で投稿します。ありがとう!
medmunds

1
あなたが出会ったならno module named appkit、実行easy_install pipしてpip install pyobjc。私にとって、それはGoogle Drive私の焦点を奪っていた
mihai

14

@Aceのスクリプトのわずかな更新を以下に示します。このスクリプトは、強制終了するまで実行され、変更されたときにのみアプリ名を出力します。繰り返しますが、このコードをファイルに保存し、でfind_focus_stealer.py実行してみてくださいpython find_focus_stealer.py

#!/usr/bin/python                                                                                                       

try:
    from AppKit import NSWorkspace
except ImportError:
    print "Can't import AppKit -- maybe you're running python from brew?"
    print "Try running with Apple's /usr/bin/python instead."
    exit(1)

from datetime import datetime
from time import sleep

last_active_name = None
while True:
    active_app = NSWorkspace.sharedWorkspace().activeApplication()
    if active_app['NSApplicationName'] != last_active_name:
        last_active_name = active_app['NSApplicationName']
        print '%s: %s [%s]' % (
            datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            active_app['NSApplicationName'],
            active_app['NSApplicationPath']
        )
    sleep(1)

これを使用して、Macでフォーカスを奪う犯人として「Googleドライブ」を追跡できました。


良いショー、サー!
ブルーノブロノスキー

これは私のために働いた。私の場合、フォーカスを盗むアプリはBetterTouchToolバージョン2.636でした。
ロリーO'Kane

1

@Aceの回答に記載されているスクリプトの改良版は次のとおりです。

#!/usr/bin/python
# Prints current window focus.
# See: /apple//q/123730
from AppKit import NSWorkspace
import time
workspace = NSWorkspace.sharedWorkspace()
active_app = workspace.activeApplication()['NSApplicationName']
print('Active focus: ' + active_app)
while True:
    time.sleep(1)
    prev_app = active_app
    active_app = workspace.activeApplication()['NSApplicationName']
    if prev_app != active_app:
        print('Focus changed to: ' + active_app)

フォーカスのあるアクティブなアプリケーションの名前を出力し、毎秒チェックすることで変更されたかどうかを検出します。

関連スクリプト:Gist でOSX焦点を当てているアプリまたはプロセスを特定する

使用法:

  1. 上記のスクリプトをファイルに保存しますget_active_focus.py
  2. chmod +x get_active_focus.pyコマンドで実行属性を割り当てます。
  3. でファイルを実行します./get_active_focus.py

出力:

$ ./get_active_focus.py
Active focus: Terminal
Focus changed to: Google Chrome

0

おそらく、アクティブプロセスのアクティビティモニターをチェックしていますか?App Nap状態にあるものはすべて簡単に除外でき、ハントが大幅に短縮される可能性があります。


はい、それは問題が何であるかについての推測を知らせる方法になりますが、実際に情報を直接取得するものを探しています。
ケビンリード14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.