41

The active window on my machine occasionally loses focus. The active app remains the same -- if I was in Chrome before, I'm still in Chrome now -- but the active window is no longer active. No window is active. This is frustrating; it happened while typing this question, and my keystrokes suddenly stopped registering.

I believe that some other app is stealing focus, but that it itself has no UI to display, so the active window becomes not active, but the active app remains active.

The question is: How do I track down the offending app, so that I can angrily delete it? Normally in cases of focus theft, the culprit is obvious, because it has focus. In this case, I'm stumped.

3 Answers3

59

Here's a script that will tell you which app is activating without telling you. I adapted it from an answer to @KevinReid's question over on Apple SE.

Leave it running in a terminal, wait for the rogue app to steal focus, and see which app is listed last. (For me: Google Drive. Others have reported Symantec AV stuff.)

#!/usr/bin/python

try: from AppKit import NSWorkspace except ImportError: print("Can't import AppKit -- try pip install PyObjC") print("(see instructions for running in a venv with PyObjC)") 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)

Note [2022]: newer versions of macOS don't ship with the PyObjC bindings this script needs. If you get an ImportError, follow these steps to run the script:

  1. Create a directory, and save the script above into it as "focus-stealer.py"
  2. In a terminal in that directory enter these commands:
    /usr/bin/python3 -m venv venv
    ./venv/bin/python -m pip install PyObjC
    
    (This creates a new, isolated Python virtual environment, just for this script, and installs PyObjC into it. This avoids modifying your system Python installation or needing to use sudo.)
  3. Now you can run the script. In a terminal in that same directory run:
    ./venv/bin/python ./focus-stealer.py
    
    (In the future, you can skip directly to this step—no need to reinstall things.)
medmunds
  • 706
1

This will sound silly and absurdly simple... I had the same problem with my laptop when I used the trackpad or built in keyboard. Had two separate laptops give similar experiences after being exposed to a bit of moisture (yes, I spilled on the keyboard).

Adding peripheral mouse and keyboard resolved it for me.

Paul E
  • 81
0

You could try my Swift app that logs changes to your focused (frontmost) app in a floating window as well as displays it in the menubar, and optionally plays a subtle sound when the focused app changes to make you aware of it.

luckman212/frontapp

menubar

log window

luckman212
  • 309
  • 2
  • 7