Установить фокус на окно на основе идентификатора, используя winAcomcom.client's AppActivate - PullRequest
2 голосов
/ 11 ноября 2011

Я пробовал следующее, но фокус не возвращается к программе, которая имела фокус при запуске скрипта:

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))

1 Ответ

3 голосов
/ 11 ноября 2011

Оказывается, что win32gui.GetForegroundWindow() возвращает дескриптор окна, а не идентификатор процесса.

win32process.GetWindowThreadProcessId(hwnd) можно использовать для получения идентификатора потока и идентификатора процесса из дескриптора.

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)
...