天天看點

python win32api 使用小技巧

前些日子,由于需要,用python寫了個小插件,通過win32api 通路外部程式的視窗 并且做些小操作。

這小夥子不錯 心熱人善

動手之前要選對好工具。(既然是基于WIN32api 當然要用微軟的專用的spyxx.exe,上手相當簡單。比較專業 ,能查出目前桌面上所有的視窗句柄和類型。VC的那個綠色版的 spy++效果不強(Au3Info.exe也一樣),無法追蹤多級子視窗。 下面是簡易代碼:(實際上就是用鈎子原理 網絡上也可以找到)

import win32ui,win32con,pyHook,pythoncom,win32gui ,wx

        def hookhandle(event):

            if event.KeyID==9:#tab鍵值

                try:

                    pwin=win32ui.FindWindow('AfxMDIFrame70',None)#主視窗 AfxMDIFrame70就是你用#spyxx.exe查找到的視窗類名

                    pwin1=win32ui.FindWindowEx(pwin,None,'MDIClient',None)

                    pwin2=win32ui.FindWindowEx(pwin1,None,'AfxFrameOrView70',None)

                    pwin3=win32ui.FindWindowEx(pwin2,None,"AfxOleControl70",None)

                    pwin4=win32ui.FindWindowEx(pwin3,None,None,"PatientCardControl Frame")#可以根據視窗#的标題名稱查找 标題名稱一般外接程式是不變的 而類名有時是變化的 比如機器重新開機 關閉等

                    pwin5=win32ui.FindWindowEx(pwin4,None,"AfxMDIFrame70",None)

                    pwin6=win32ui.FindWindowEx(pwin5,None,"AfxWnd70",None)

                    pwin7=win32ui.FindWindowEx(pwin6,None,"#32770",None)

                    textbox=pwin7.GetDlgItem(222)#擷取控件的ID

                    textbox2=pwin7.GetDlgItem(224)

                    buf='0x0'*1024

                    buf2='0x0'*1024

                    textbox.SendMessage(win32con.WM_SETTEXT,"")#先清空控件内容

                    textbox2.SendMessage(win32con.WM_SETTEXT,"")

                    oldlen=textbox.SendMessage(win32con.WM_GETTEXT,buf)

                    oldlen2=textbox2.SendMessage(win32con.WM_GETTEXT,buf2)

                    textbox.SendMessage(win32con.WM_SETTEXT,buf[0:oldlen]+str(blh))#發送消息 注意不能##用%s 替換 是以一般需要全局變量 來替換

                    textbox2.SendMessage(win32con.WM_SETTEXT,buf2[0:oldlen]+str(name))

                except:

                    wx.LogMessage('沒有發現可用的視窗!請確定程式已經運作')

        hm = pyHook.HookManager()#初始執行個體

        hm.KeyDown=hookhandle

        hm.HookKeyboard()

        pythoncom.PumpMessages(5000)#據說是winctype的新功能 延遲吧 具體什麼也不清楚

        hm.UnhookKeyboard()#釋放鍵盤捕捉 好像效果不明顯

        #for i in range (0,40):

            #win32api.Sleep(20)

            #if win32ui.PumpWaitingMessages(0,-1):

        win32api.PostQuitMessage(0)# 退出監控消息 很關鍵 必須配合sys.setrecursionlimit(4000)使用效果##才明顯 不然的話 程式無法退出。

               #raise exceptions.SystemExit

    def OnClose(self, event):

        sys.setrecursionlimit(4000)#相當關鍵

        self.Close(True)

        self.Destroy()