Python鎖定焦點到指定進程窗口的參考方法

在使用python的過程中,有時會遇到這種需求:開啟了很多窗口,需要把焦點鎖定到某個進程的窗口上,再對該窗口進行操作。例如:我們打開了notepad.exe和wordpad.exe應用程序,現在需要把焦點定位到notepad窗口上,在notepad窗口中進行輸入。

參考代碼如下,其原理為:通過獲取進程的pid來遍歷該進程下的所有窗口,由于notepad.exe只有一個窗口,所以可得到一個窗口的句柄。再調用win32gui的SetForegroundWindow(hwnd),把該hwnd置首。

import win32con

import win32gui

import win32process

def get_hwnds_for_pid (pid):

? ? def callback (hwnd, hwnds):

? ? ? ? if win32gui.IsWindowVisible (hwnd) and win32gui.IsWindowEnabled (hwnd):

? ? ? ? ? ? _, found_pid = win32process.GetWindowThreadProcessId (hwnd)

? ? ? ? ? ? if found_pid == pid:

? ? ? ? ? ? ? ? hwnds.append (hwnd)

? ? ? ? ? ? return True

? ? hwnds = []

? ? win32gui.EnumWindows (callback, hwnds)

? ? return hwnds

if __name__ == '__main__':

? ? import subprocess

? ? import time

? ? notepad = subprocess.Popen ([" ?notepad.exe"])

? ? #

? ? # sleep to give the window time to appear

? ? #

? ? time.sleep (2.0)

? ? print (notepad.pid)

? ? for hwnd in get_hwnds_for_pid (notepad.pid):

? ? ? ? print (hwnd, "=>", win32gui.GetWindowText (hwnd))

? ? ? ? win32gui.SetForegroundWindow(hwnd)

我們使用pywinauto庫,其中的HwndWrapper類中有SetFocus函數,該函數在實踐過程中有些情況下會失效。可修改SetFocus函數,在其開始處先嘗試執行如下代碼:

1ctypes.windll.user32.SwitchToThisWindow(self.handle,True)2win32functions.SetFocus(self)

如果發生異常,再繼續執行原來的內容。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 進程、進程的使用、進程注意點、進程間通信-Queue、進程池Pool、進程與線程對比、文件夾拷貝器-多任務 1.進...
    Cestine閱讀 861評論 0 0
  • 進程 操作系統背景知識 顧名思義,進程即正在執行的一個過程。進程是對正在運行程序的一個抽象。 進程的概念起源于操作...
    go以恒閱讀 960評論 0 2
  • 網絡編程 一.楔子 你現在已經學會了寫python代碼,假如你寫了兩個python文件a.py和b.py,分別去運...
    go以恒閱讀 2,051評論 0 6
  • 進程間通信——隊列和管道(multiprocess.Queue、multiprocess.Pipe) 進程間通信 ...
    go以恒閱讀 1,792評論 0 3
  • 是日,微雨北京,悠然出城;心系草原,一路向北,景行行,風盈盈;途遇美景,疊瀑淙淙,梯樹蔥蔥。 舟車勞頓,時辰七鐘,...
    嘯傲天涯_阿思藍閱讀 303評論 4 7