Python pywin32(一)

一准备部分

工欲善其事必先利其器,先装个Spy++,见我的另一篇博客。

正文部分

貌似在win32编程的世界里,包括窗口到文本框的所有控件就是窗体,所有的窗体都有独立的句柄。要操作任意一个窗体,你都需要找到这个窗体的句柄,这里,我们就可以用到FindWindow函数FindWindowEx函数。在pywin32中,他们都属于win32gui的模块。

FindWindow(lpClassName=None, lpWindowName=None):

作用:自顶层窗口(也就是桌面)开始搜索条件匹配的窗体,并返回这个窗体的句柄。不搜索子窗口、不区分大小写。找不到就返回0
找顶层

  • lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。
  • lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。
FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None);

找子窗体
作用:搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄。不区分大小写,找不到就返回0。

  • hwndParent:若不为0,则搜索句柄为hwndParent窗体的子窗体。

  • hwndChildAfter:若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。

  • lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。

  • lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。
    (找到了主窗口以后就靠它来定位子窗体啦。)
    有了这两个函数,我们就可以写出可以定义到任意一个窗体句柄的函数啦:

     def find_idxSubHandle(pHandle, winClass, index=0):
         """
         已知子窗口的窗体类名
         寻找第index号个同类型的兄弟窗口
         """
         assert type(index) == int and index >= 0
         handle = win32gui.FindWindowEx(pHandle, 0, winClass, None)
         while index > 0:
             handle = win32gui.FindWindowEx(pHandle, handle, winClass, None)
             index -= 1
         return handle
      
      
     def find_subHandle(pHandle, winClassList):
         """
         递归寻找子窗口的句柄
         pHandle是祖父窗口的句柄
         winClassList是各个子窗口的class列表,父辈的list-index小于子辈
         """
         assert type(winClassList) == list
         if len(winClassList) == 1:
             return find_idxSubHandle(pHandle, winClassList[0][0], winClassList[0][1])
         else:
             pHandle = find_idxSubHandle(pHandle, winClassList[0][0], winClassList[0][1])
             return find_subHandle(pHandle, winClassList[1:])
    

		import win32gui
		import win32con
		win = win32gui.FindWindow('Notepad','新建文本文档.txt - 记事本')#窗体类名,窗口标题栏上你能看见的那个标题。
		
		tid = win32gui.FindWindowEx(win,None,'Edit',None)#找win句柄的子窗体,
		win32gui.SendMessage(tid, win32con.WM_SETTEXT, None, '你好hello word!')
		win32gui.PostMessage(tid,win32con.WM_KEYDOWN,win32con.VK_RETURN,0)
		print("%x" % tid)
		print("%x" % win)
SendMessage(hWnd, Msg, wParam, lParam)
  • hWnd–代表窗体的句柄
  • wParam-一个参数,没有使用,为0
    1,当Msg为win32con.WM_SETTEXT时此时的状态是设置窗体的文本,窗体的文本将被设置为IParam这个参数
win32gui.PostMessage(win,win32con.WM_KEYDOWN,win32con.VK_RETURN,0):win32gui.PostMessage(win,win32con.WM_KEYUP,win32con.VK_RETURN,0)

模拟按下发送按钮,按下和弹起;

	import win32gui
	import win32con
	a = "说明这个函数我们仅能kjjghjk用"
	win = win32gui.FindWindow("TXGuiFoundation", "01")#窗体类名,窗口标题栏上你能看见的那个标题。
	
	#tid = win32gui.FindWindowEx(win,None,'TXGuiFoundation',None)#找win句柄的子窗体,
	win32gui.SendMessage(win, win32con.WM_SETTEXT, None, a)
	win32gui.PostMessage(win,win32con.WM_KEYDOWN,win32con.VK_RETURN,0)
	win32gui.PostMessage(win,win32con.WM_KEYUP,win32con.VK_RETURN,0)
	print("%x" % win)
	print("%x" % win)

你可能感兴趣的:(Python)