python---win32gui、win32con、win32api:winAPI操作


python操作winAPI

 

窗口操作:

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from lianxi import Ui_Form
from PyQt5.QtCore import Qt
import win32gui  #winAPI模塊--以便於操作窗口


class Win(QWidget,Ui_Form):
    def __init__(self):
        super(Win, self).__init__()
        self.setupUi(self)
        self.setWindowFlag(Qt.MSWindowsFixedSizeDialogHint)  # 窗體不能調整大小
        self.setWindowTitle('練習')


    def lianxi1(self):  #win32gui按鈕的槽函數
        self.hwnd = win32gui.GetForegroundWindow()  # 獲取最前窗口句柄
        self.hwnd = win32gui.FindWindow(0, wdname)  # 根據窗口標題,取得窗口句柄
        # 函數功能:該函數獲得一個頂層窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個函數不查找子窗口。在查找時不區分大小寫
        # 參數1 窗口類名
        # 參數2 窗口標題--必須完整;如果該參數為None,則為所有窗口全匹配
        # 返回值:如果函數成功,返回值為窗口句柄;如果函數失敗,返回值為0

        #self.hwnd = win32gui.FindWindow("Notepad", None)  # 根據窗口類名,取得窗口句柄

        print('窗口句柄為:', self.hwnd)
        if self.hwnd != 0:
            win32gui.SetForegroundWindow(self.hwnd)  # 窗口顯示最前面
            # 參數:窗口句柄
        text = win32gui.GetWindowText(self.hwnd)  # 獲取窗口標題
        print('窗口標題為:', text)
        clsname = win32gui.GetClassName(self.hwnd)  #獲取窗口類名
        print('窗口類名:',clsname)
        left, top, right, bottom = win32gui.GetWindowRect(self.hwnd)  # 獲取窗口位置
        #left, top是左上角坐標;right, bottom是右下角坐標
        print('窗口位置',left, top, right, bottom)

        windows = []  #自定義參數,可以是任何類型
        #win32gui.EnumWindows(self.ss, windows)  #尋找所有頂層窗口的句柄
        #參數1:回調函數名稱,每找到一個句柄就把句柄和windows傳給a和b,並執行一次回調函數
        #參數2:必須有,可以向回調函數傳遞一些其它參數--傳給b,可以是任何類型
        #枚舉屏幕上的所有的頂層窗口,輪流地將這些窗口的句柄傳遞給回調函數的a參數。EnumWindows會一直進行下去,直到枚舉完所有的頂層窗口,或者回調函數返回了FALSE.


        #打開一個記事本
        self.hwnd1 = win32gui.FindWindow("Notepad", None)
        print("父窗口句柄:",self.hwnd1)
        win32gui.EnumChildWindows(self.hwnd1,self.sss,windows)  #尋找子窗口句柄
        #參數1  父窗口句柄,如果此參數為Null,則此函數等效於EnumWindows;每找到一個句柄就把句柄和windows傳給a和b,並執行一次回調函數
        #參數2 回調函數
        #參數3 自定義參數
        #枚舉所有子窗口,輪流地將這些窗口的句柄傳遞給回調函數的a參數。函數會一直進行下去,直到枚舉完所有的子窗口,或者回調函數返回了FALSE
        #特別注意:qt只有一個窗體,里面控件的句柄是找不到的--所以這條指令不能用在Qt繪制的窗口上

        #打開彗星小助手
        self.hwnd=win32gui.FindWindowEx(0,0,0,'彗星小助手')  #查找窗口或子窗口句柄
        #參數1 父窗口句柄;如果是 0, 則函數以桌面窗口為父窗口;如果是 HWND_MESSAGE, 函數僅查找消息窗口
        #參數2 子窗口句柄,必須是參數1的直接子窗口;子窗口以Z序排列,查找參數后面的子窗口;如果是 0, 查找從父窗口的第一個子窗口開始
        #如果參數1和參數2同時是 0, 則函數查找所有的頂層窗口及消息窗口
        #參數3 類名
        #參數4  標題;可以是None
        #返回找到的第一個窗口的句柄
        print('彗星小助手的句柄:',self.hwnd)

        subHandle = win32gui.FindWindowEx(self.hwnd1, 0, "EDIT", None)  # 筆記本類名為EDIT的句柄
        # 編輯框的句柄

        menuHandle = win32gui.GetMenu(self.hwnd1)  #獲取窗口的菜單句柄
        #參數 窗口句柄
        print('記事本菜單句柄:',menuHandle)

        subMenuHandle = win32gui.GetSubMenu(menuHandle, 0)  # 獲得子菜單或下拉菜單句柄
        #參數1 菜單句柄
        #參數2 子菜單索引號
        print('子菜單文件句柄:',subMenuHandle)

        menuItemHandle = win32gui.GetMenuItemID(subMenuHandle, 0) # 獲得菜單項中的的標志符ID,注意,分隔符是被編入索引的
        #參數1 子菜單句柄--文件菜單句柄
        #參數2 項目索引號
        #1
        print(menuItemHandle)


    def sss(self,a,b):
        print(a,b)
    def ss(self,a,b):
        print(a,b)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    wdname = u'練習'
    demo = Win()
    demo.show()
    sys.exit(app.exec_())

代碼下載:https://pan.baidu.com/s/1YZ5ifLRO6lCxiJ2blRbMsg  

 

        hwnd=self.hwnd1 = win32gui.FindWindow("Notepad", None)
        i=win32gui.IsIconic(hwnd)  #檢查窗口是否最小化
        #是  返回1,不是返回0
        win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)  #不要最小化
        hwnd=win32gui.FindWindow("Notepad", None)
        win32gui.ShowWindow(hwnd, win32con.SW_HIDE)  #隱藏窗口
        time.sleep(2)
        win32gui.ShowWindow(hwnd, win32con.SW_SHOW)  #顯示窗口
        #SW_SHOW:在窗口原來的位置以原來的尺寸激活和顯示窗口

 

 

 

發送消息: 

關閉窗口:

        self.hwnd = win32gui.FindWindow(0, '練習')
        win32gui.PostMessage(self.hwnd, win32con.WM_CLOSE, 0, 0)  #關閉窗口
        #參數1 窗口句柄

 

        handle = win32gui.FindWindow("Notepad", None)
        subHandle = win32gui.FindWindowEx(handle, 0, "EDIT", None)
        i=win32api.SendMessage(subHandle, win32con.WM_SETTEXT, 0, '我是中國人')  #向窗口發送文本
        #原文本全部被替換
        #參數1 窗口句柄
        #參數4 發送的文本
        #等待窗口處理完畢后返回true

 

        self.hwnd = win32gui.FindWindow("Notepad", None)
        bufSize = win32api.SendMessage(self.hwnd, win32con.WM_GETTEXTLENGTH, 0, 0)  #獲取窗口文本的字符數
        hwnd=win32gui.FindWindow("Notepad", None)
        win32gui.ShowWindow(hwnd, win32con.SW_HIDE)  #隱藏窗口
        time.sleep(2)
        win32gui.ShowWindow(hwnd, win32con.SW_SHOW)  #顯示窗口
        #SW_SHOW:在窗口原來的位置以原來的尺寸激活和顯示窗口
        hwnd=win32gui.FindWindow("Notepad", None)
        win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)  #最大化指定的窗口。nCmdShow=3
        win32gui.ShowWindow(hwnd, win32con.SW_MINIMIZE)  #最小化指定的窗口並且激活在Z序中的下一個頂層窗口。nCmdShow=6
hwnd=win32gui.FindWindow("Notepad", None)
win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)  #激活並顯示窗口。如果窗口最小化或最大化,則系統將窗口恢復到原來的尺寸和位置。在恢復最小化窗口時,應用程序應該指定這個標志。nCmdShow=9
        hwnd=win32gui.FindWindow("Notepad", None)
        win32gui.ShowWindow(hwnd, win32con.SW_SHOWMAXIMIZED)  #激活窗口並將其最大化。nCmdShow=3
        # SW_SHOWMINIMIZED:激活窗口並將其最小化。nCmdShow=2。
        # SW_SHOWMINNOACTIVE:窗口最小化,激活窗口仍然維持激活狀態。nCmdShow=7。
        # SW_SHOWNA:以窗口原來的狀態顯示窗口。激活窗口仍然維持激活狀態。nCmdShow=8。
        # SW_SHOWNOACTIVATE:以窗口最近一次的大小和狀態顯示窗口。激活窗口仍然維持激活狀態。nCmdShow=4。
        # SW_SHOWNORMAL:激活並顯示一個窗口。如果窗口被最小化或最大化,系統將其恢復到原來的尺寸和大小。應用程序在第一次顯示窗口的時候應該指定此標志。nCmdShow=1。

 

 

 

 

鼠標操作: 

        win32api.SetCursorPos([30,150])  #鼠標定位到(30,50)--坐標系屏幕
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) #執行左單鍵擊,若需要雙擊則延時幾毫秒再點擊一次即可
        win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)  #右鍵單擊

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM