Set focus to window based on ID using win32com.client's AppActivate

11,880

It turns out that win32gui.GetForegroundWindow() returns the window handle and not the process ID.

win32process.GetWindowThreadProcessId(hwnd) can be used to get the thread ID and process ID from the handle.

import win32com.client
import win32gui
import win32process

hwnd = win32gui.GetForegroundWindow()

_, pid = win32process.GetWindowThreadProcessId(hwnd)

shell = win32com.client.Dispatch("WScript.Shell")

shell.AppActivate('Console2')
shell.SendKeys('{UP}{ENTER}')

shell.AppActivate(pid)
Share:
11,880
Acorn
Author by

Acorn

Updated on July 16, 2022

Comments

  • Acorn
    Acorn almost 2 years

    I've tried the following, but focus isn't returned to the program that had focus when the script was run:

    import win32com.client
    import win32gui
    
    current = win32gui.GetForegroundWindow()
    
    shell = win32com.client.Dispatch("WScript.Shell")
    
    shell.AppActivate('Console2')
    
    shell.SendKeys('{UP}{ENTER}')
    
    shell.AppActivate(str(current))