海上月明

          editer by sun
          posts - 162, comments - 51, trackbacks - 0, articles - 8
             :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

          [轉]python win32api 使用小技巧

          Posted on 2013-07-25 16:40 pts 閱讀(1525) 評論(0)  編輯  收藏 所屬分類: Python

          From:http://www.cnblogs.com/txw1958/archive/2012/02/16/2353491.html

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

          因為原來對win32api 不怎么熟悉 所以只好求救。群里有個QQ:32034767 唐驍勇tsy_007@163.com

          這小伙子不錯 心熱人善

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

          import win32ui,win32con,pyHook,pythoncom,win32gui ,wx
                  def hookhandle(event):
                      
                      if event.KeyID==9:#tab鍵值
                          try:
                              pwin=win32gui.FindWindow('AfxMDIFrame70',None)#主窗口 AfxMDIFrame70就是你用#spyxx.exe查找到的窗口類名
                              pwin1=win32gui.FindWindowEx(pwin,None,'MDIClient',None)
                              pwin2=win32gui.FindWindowEx(pwin1,None,'AfxFrameOrView70',None)
                              pwin3=win32gui.FindWindowEx(pwin2,None,"AfxOleControl70",None)
                              pwin4=win32gui.FindWindowEx(pwin3,None,None,"PatientCardControl Frame")#可以根據窗口#的標題名稱查找 標題名稱一般外接程序是不變的 而類名有時是變化的 比如機器重啟 關閉等 
                              pwin5=win32gui.FindWindowEx(pwin4,None,"AfxMDIFrame70",None)
                              pwin6=win32gui.FindWindowEx(pwin5,None,"AfxWnd70",None)
                              pwin7=win32gui.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()

          主站蜘蛛池模板: 天镇县| 德庆县| 青川县| 彭阳县| 泸溪县| 本溪| 霍州市| 龙游县| 泰州市| 通榆县| 漳平市| 陈巴尔虎旗| 天峨县| 桓台县| 阿克苏市| 临泽县| 邻水| 宁津县| 鲁甸县| 依安县| 惠水县| 金门县| 延安市| 新泰市| 始兴县| 江城| 额济纳旗| 西平县| 六盘水市| 文化| 通化市| 平湖市| 临邑县| 武平县| 中阳县| 体育| 鲁甸县| 林州市| 宁海县| 旌德县| 同江市|