轉 python win32api操作

來源:互聯網
上載者:User

標籤:inf   發送   post   子視窗   動手   import   名稱尋找   str   執行個體   

前些日子,由於需要,用python寫了個小外掛程式,通過win32api 訪問外部程式的視窗 並且做些小操作。

 

因為原來對win32api 不怎麼熟悉 所以只好求救。群裡有個QQ:32034767 唐驍勇 [email protected]

 

這小夥子不錯 心熱人善

 

動手之前要選對好工具。(既然是基於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()

轉 python win32api操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.