1.如何利用句柄操作windows窗体
首先,获得窗体的句柄 win32api.FindWindows()
第二,获得窗体中控件的id号,spy++
第三,根据控件的ID获得控件的句柄(hwnd) GetDlgItem(hwnd,loginID)
最后,利用控件句柄进行操作
python可以通过win32api轻松获取控件的属性值
通过标签找到主窗口句柄,然后通过主句柄获取下属控件句柄
#-*- coding: utf-8 -*- ##设置编码方式
import win32api,win32gui,win32con
label = 'tt' #此处假设主窗口名为tt
hld = win32gui.FindWindow(None, label)
if hld > 0:
dlg = win32api.FindWindowEx(hld, None, 'Edit', None)#获取hld下第一个为edit控件的句柄
buffer = '0' *50
len = win32gui.SendMessage(dlg, win32con.WM_GETTEXTLENGTH)+1 #获取edit控件文本长度
win32gui.SendMessage(dlg, win32con.WM_GETTEXT, len, buffer) #读取文本
print buffer[:len-1]
#虚拟鼠标点击按钮(或者回车)
btnhld = win32api.FindWindowEx(hld, None,'Button', None)
# win32gui.PostMessage(btnhld, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
# win32gui.PostMessage(btnhld, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
win32gui.PostMessage(btnhld, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)
win32gui.PostMessage(btnhld, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)
#获取显示器屏幕大小
width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)
#点击窗口buttonw=win32ui.FindWindow(clsname,windowtitle)b=w.GetDlgItem(窗口id)b.postMessage(win32con.BM_CLICK)#关闭窗体import win32uiimport win32conwnd=win32ui.FindWindow(classname,None)wnd.SendMessage(win32con.WM_CLOSE) 成功!import win32uiw=win32ui.FindWindow(classname,窗体title)print w.GetDlgItemText(0xFFFF) # 获得弹窗里的消息文字最小化窗体w=win32gui.FindWindow()win32gui.CloseWindow(w)
浏览器密码控件操作
# coding=utf-8
import win32gui
import win32apiimport win32condef CallBack(hwnd, hwnds):
if win32gui.GetClassName(hwnd) == 'Edit': hwnds[win32gui.GetClassName(hwnd)] = hwnd return True w1hd = win32gui.FindWindow(u'IEFrame', None)print '%x' %w1hd
# w2hd = win32gui.FindWindowEx(w1hd,0,u'TabWindowClass', None)# print '%x' %w2hd
hwndChildList = {}
win32gui.EnumChildWindows(w1hd, CallBack, hwndChildList)for k,v in hwndChildList.items():
print '%s %x' %(k,v) #win32api.SendMessage(v, win32con.WM_CHAR, ord('a'), 0) #t1 =win32gui.GetDlgItem(v,1) len1 = win32gui.SendMessage(v, win32con.WM_GETTEXTLENGTH)+1 buffer = '0' *50 win32gui.SendMessage(v, win32con.WM_GETTEXT, len1, buffer)print len1
print buffer[:len1-1] win32gui.SendMessage(v,win32con.WM_SETTEXT,None,'902723')