Pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等。

1.通过类名和标题查找窗口句柄,并获得窗口位置和大小

import win32gui

import win32api

classname = "MozillaWindowClass"

titlename = "百度一下,你就知道 - Mozilla Firefox"

#获取句柄

hwnd = win32gui.FindWindow(classname, titlename)

#获取窗口左上角和右下角坐标

left, top, right, bottom = win32gui.GetWindowRect(hwnd)

2.通过父句柄获取子句柄

def get_child_windows(parent):

'''

获得parent的所有子窗口句柄

返回子窗口句柄列表

'''

if not parent:

return

hwndChildList = []

win32gui.EnumChildWindows(parent, lambda hwnd, param: param.append(hwnd), hwndChildList)

return hwndChildList

#获取某个句柄的类名和标题

title = win32gui.GetWindowText(hwnd)

clsname = win32gui.GetClassName(hwnd)

#获取父句柄hwnd类名为clsname的子句柄

hwnd1= win32gui.FindWindowEx(hwnd, None, clsname, None)

3.鼠标定位与点击

#鼠标定位到(30,50)

win32api.SetCursorPos([30,150])

#执行左单键击,若需要双击则延时几毫秒再点击一次即可

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

#右键单击

win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)

4.发送回车键

win32api.keybd_event(13,0,0,0)

win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)

5.关闭窗口

win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0)

一, 首先import win32gui, win32con

二, 使用win32gui.FindWindow找到目标程序:

win = win32gui.FindWindow(None, 'User Login')

三, 使用win32gui.FindWindowEx找到目标文本框:

tid = win32gui.FindWindowEx(win, None, 'Edit', None)

四, 使用win32gui.SendMessage发送文本到目标文本框:

win32gui.SendMessage(tid, win32con.WM_SETTEXT, None, 'hello')

当然了,可以继续找到下一个文本框:

username = win32gui.FindWindowEx(win, tid, 'Edit', None)

只是还没找到给字符串加回车的功能,在记事本里可以实现,不知道为什么在这里不行。如果各位大侠有知道的希望不吝赐教。

目前先研究到这里。以防忘记所以记在这里,以备以后使用。

更新:已经找到发送回车的方法:

win32gui.SendMessage(tid, win32con.WM_SETTEXT, None, ‘hello')

win32gui.PostMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)

win32gui.PostMessage(tid, win32con.WM_KEYUP, win32con.VK_RETURN, 0)

实例:

import win32gui

import win32con

import win32api

# 从顶层窗口向下搜索主窗口,无法搜索子窗口

# FindWindow(lpClassName=None, lpWindowName=None) 窗口类名 窗口标题名

handle = win32gui.FindWindow("Notepad", None)

# 获取窗口位置

left, top, right, bottom = win32gui.GetWindowRect(handle)

#获取某个句柄的类名和标题

title = win32gui.GetWindowText(handle)

clsname = win32gui.GetClassName(handle)

# 打印句柄

# 十进制

print(handle)

# 十六进制

print("%x" %(handle) )

# 搜索子窗口

# 枚举子窗口

hwndChildList = []

win32gui.EnumChildWindows(handle, lambda hwnd, param: param.append(hwnd), hwndChildList)

# FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None) 父窗口句柄 若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。 子窗口类名 子窗口标题

subHandle = win32gui.FindWindowEx(handle, 0, "EDIT", None)

# 获得窗口的菜单句柄

menuHandle = win32gui.GetMenu(subHandle)

# 获得子菜单或下拉菜单句柄

# 参数:菜单句柄 子菜单索引号

subMenuHandle = win32gui.GetSubMenu(menuHandle, 0)

# 获得菜单项中的的标志符,注意,分隔符是被编入索引的

# 参数:子菜单句柄 项目索引号

menuItemHandle = win32gui.GetMenuItemID(subMenuHandle, 0)

# 发送消息,加入消息队列,无返回

# 参数:句柄 消息类型 WParam IParam

win32gui.postMessage(subHandle, win32con.WM_COMMAND, menuItemHandle, 0)

# wParam的定义是32位整型,high word就是他的31至16位,low word是它的15至0位。

# 当参数超过两个,wParam和lParam不够用时,可以将wParam就给拆成两个int16来使用。

# 这种时候在python里记得用把HIWORD的常数向左移16位,再加LOWORD,即wParam = HIWORD<<16+LOWORD。

# 下选框内容更改

# 参数:下选框句柄; 消息内容; 参数下选框的哪一个item,以0起始的待选选项的索引;如果该值为-1,将从组合框列表中删除当前选项,并使当前选项为空; 参数

# CB_Handle为下选框句柄,PCB_handle下选框父窗口句柄

if win32api.SendMessage(CB_handle, win32con.CB_SETCURSEL, 1, 0) == 1:

# 下选框的父窗口命令

# 参数:父窗口句柄; 命令; 参数:WParam:高位表示类型,低位表示内容;参数IParam,下选框句柄

# CBN_SELENDOK当用户选择了有效的列表项时发送,提示父窗体处理用户的选择。 LOWORD为组合框的ID. HIWORD为CBN_SELENDOK的值。

win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x90000, CB_handle)

# CBN_SELCHANGE当用户更改了列表项的选择时发送,不论用户是通过鼠标选择或是通过方向键选择都会发送此通知。LOWORD为组合框的ID. HIWORD为CBN_SELCHANGE的值。

win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x10000, CB_handle)

# 设置文本框内容,等窗口处理完毕后返回true。中文需编码成gbk

# 参数:句柄;消息类型;参数WParam,无需使用; 参数IParam,要设置的内容,字符串

win32api.SendMessage(handle, win32con.WM_SETTEXT, 0, os.path.abspath(fgFilePath).encode('gbk'))

# 控件点击确定,处理消息后返回0

# 参数:窗口句柄; 消息类型; 参数WParam HIWORD为0(未使用),LOWORD为控件的ID; 参数IParam 0(未使用),确定控件的句柄

win32api.SendMessage(Mhandle, win32con.WM_COMMAND, 1, confirmBTN_handle)

# 获取窗口文本不含截尾空字符的长度

# 参数:窗口句柄; 消息类型; 参数WParam; 参数IParam

bufSize = win32api.SendMessage(subHandle, win32con.WM_GETTEXTLENGTH, 0, 0) +1

# 利用api生成Buffer

strBuf = win32gui.PyMakeBuffer(bufSize)

print(strBuf)

# 发送消息获取文本内容

# 参数:窗口句柄; 消息类型;文本大小; 存储位置

length = win32gui.SendMessage(subHandle, win32con.WM_GETTEXT, bufSize, strBuf)

# 反向内容,转为字符串

# text = str(strBuf[:-1])

address, length = win32gui.PyGetBufferAddressAndLen(strBuf)

text = win32gui.PyGetString(address, length)

# print('text: ', text)

# 鼠标单击事件

#鼠标定位到(30,50)

win32api.SetCursorPos([30,150])

#执行左单键击,若需要双击则延时几毫秒再点击一次即可

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

#右键单击

win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)

def click1(x,y): #第一种

win32api.SetCursorPos((x,y))

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

def click2(x,y): #第二种

ctypes.windll.user32.SetCursorPos(x,y)

ctypes.windll.user32.mouse_event(2,0,0,0,0)

ctypes.windll.user32.mouse_event(4,0,0,0,0)

def click_it(pos): #第三种

handle= win32gui.WindowFromPoint(pos)

client_pos =win32gui.ScreenToClient(handle,pos)

tmp=win32api.MAKELONG(client_pos[0],client_pos[1])

win32gui.SendMessage(handle, win32con.WM_ACTIVATE,win32con.WA_ACTIVE,0)

win32gui.SendMessage(handle, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON,tmp)

win32gui.SendMessage(handle, win32con.WM_LBUTTONUP,win32con.MK_LBUTTON,tmp)

# 发送回车

win32api.keybd_event(13,0,0,0)

win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)

# 关闭窗口

win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0)

# 检查窗口是否最小化,如果是最大化

if(win32gui.IsIconic(hwnd)):

# win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)

win32gui.ShowWindow(hwnd, 8)

sleep(0.5)

# SW_HIDE:隐藏窗口并激活其他窗口。nCmdShow=0。

# SW_MAXIMIZE:最大化指定的窗口。nCmdShow=3。

# SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。

# SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。

# SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。

# SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。nCmdShow=10。

# SW_SHOWMAXIMIZED:激活窗口并将其最大化。nCmdShow=3。

# SW_SHOWMINIMIZED:激活窗口并将其最小化。nCmdShow=2。

# SW_SHOWMINNOACTIVE:窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。

# SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。

# SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。

# SW_SHOWNORMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

# win32虽然也可控制键盘,但不如使用PyUserInput的方便。需要注意在windows和mac下接口参数可能有所不同。

from pymouse import PyMouse

from pykeyboard import PyKeyboard

m = PyMouse()

k = PyKeyboard()

x_dim, y_dim = m.screen_size()

# 鼠标点击

m.click(x_dim/2, y_dim/2, 1)

# 键盘输入

k.type_string('Hello, World!')

# 按住一个键

k.press_key('H')

# 松开一个键

k.release_key('H')

# 按住并松开,tap一个键

k.tap_key('e')

# tap支持重复的间歇点击键

k.tap_key('l',n=2,interval=5)

# 发送判断文字

k.type_string('123456')

#创建组合键

k.press_key(k.alt_key)

k.tap_key(k.tab_key)

k.release_key(k.alt_key)

# 特殊功能键

k.tap_key(k.function_keys[5]) # Tap F5

k.tap_key(k.numpad_keys['Home']) # Tap 'Home' on the numpad

k.tap_key(k.numpad_keys[5], n=3) # Tap 5 on the numpad, thrice

# Mac系统

k.press_keys(['Command','shift','3'])

# Windows系统

k.press_keys([k.windows_l_key,'d'])

其中的PyMouseEvent和PyKeyboardEvent还可用于监听鼠标和键盘事件的输入

python win32api sendmessage_win32api win32gui win32con 窗口句柄 发送消息 常用方法相关推荐

  1. python控制windows窗口、并输入数据_python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入...

    import win32gui import win32con import win32api # 从顶层窗口向下搜索主窗口,无法搜索子窗口 # FindWindow(lpClassName=None ...

  2. python给窗口发送消息_python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入...

    import win32gui import win32con import win32api # 从顶层窗口向下搜索主窗口,无法搜索子窗口 # FindWindow(lpClassName=None ...

  3. Python使用飞书群机器人发送消息

    原创文|Space9 机器人简单介绍 飞书群中的自定义机器人是通过webhook的形式将你要发送的消息即时发送到群聊中 在群聊中添加机器人 进入群聊,打开群设置,找到群机器人,并点击添加机器人.选择C ...

  4. python发邮件给多个人发送消息_【Python3】 发送邮件给多人

    1.收件人邮箱msg_to=['258507328@qq.com,1501949013@qq.com,277544354@qq.com'],以列表的方式给出. 2.message['To'] =',' ...

  5. 使用python 及 酷Q 控制扣扣发送消息

    在这里插入代码片## 酷Q使用 首先我们要下载酷Q 使用酷Q开发文档 进行前期准备工作 需要注意的是 我们要使用python2.7 或者 3.7 当出现RPC调用失败时我们可以参照开发文档 中的RPC ...

  6. python程序向企业微信机器人发送消息

    一.创建企业群聊 二.创建机器人 点击完成,复制webhook地址,如下: 三.执行代码 import requestsweb_hook_url = "https://qyapi.weixi ...

  7. python训练营微信广告发送机_python实现给微信公众号发送消息的方法

    本文实例讲述了python实现给微信公众号发送消息的方法.分享给大家供大家参考,具体如下: 现在通过发微信公众号信息来做消息通知和告警已经很普遍了.最常见的就是运维通过zabbix调用shell脚本给 ...

  8. python + win32api,win32gui,win32con 写 exe 窗口的时候,怎么创建按钮呢?

    问题描述: 自己用 python + win32api 想写 exe 脚本文件,但是按钮都不会创建 python + win32api,win32gui,win32con 写 exe 窗口的时候,怎么 ...

  9. Python发送微信消息(文字、图片、文件)给指定好友和微信群(调用Win32 API模拟人的手动操作来发送消息)

    本示例是调用Windows API模拟发送,用Python调用win32api这个库来调用Windows API模拟人的手动操作来发送消息. 在使用前,请将你微信的窗口设置为在最前面,这样就便于程序找 ...

  10. 初学Python第三天写的一个PC版模拟微信自动给好友发送消息

    本程序能做什么: 在PC版的微信界面,模拟鼠标键盘动作,随机对好友列表里的某些好友发送文本消息和图片 (因为本人以前没有WINDOW UI的编程经验,所以这几天对WIN32UI接口基本是边学边搜边用, ...

最新文章

  1. Python容器类型公共方法汇总
  2. 深入Java核心:JVM中的栈和局部变量
  3. gbdt算法_GBDT算法原理及应用
  4. SpringMvc_@RequestMapping设置Router Url大小写不敏感
  5. 谷歌浏览器设置新标签页地址的方法
  6. MyBatis的分页插件PageHelper的使用
  7. 国内大公司的开源项目一览表(包含mysql读写分离等)
  8. 线阵相机和面阵相机的区别
  9. PrintWindow截取隐藏窗口
  10. 关于es的使用-es语法
  11. 怎样用c语言画二次函数图像,已知函数表达式如何画图像
  12. 共享单车在疯狂造车,ofo为什么要玩连接+共享单车模式?
  13. PS制作一寸照片具体过程
  14. python人机猜拳游戏代码_python 实现人和电脑猜拳的示例代码
  15. Jsp+Ssm+Mysql实现的零食商城系统
  16. C语言编译能否被七整除,求c语言高手输出1000以内既能被5整除又能被7整除
  17. 4万程序员学了10万次的课程,今天,曝光背后的讲师!
  18. 一般梯度、随机梯度、相对梯度和自然梯度
  19. 【Spring学习之生命周期】什么是生命周期?什么是作用域?了解六种作用域
  20. 【体系结构 三 流水线技术】

热门文章

  1. matlab教程r2018a教材,MATLAB教程(R2018a)
  2. 如何csdn复制他人博客文章到自己博客下?
  3. java基于springboot高校后勤报修管理系统
  4. NAT技术与代理服务器
  5. Java历史版本官方下载地址(Java 6、Java 7)
  6. Linux内核启动内核解压过程分析
  7. 如何在css中将图片横向摆放,css如何将图片横向平铺?
  8. 【总结】防病毒网关---防毒墙
  9. 智力问答选择题_2018智力问答题大全及答案:智力问答题大全及答案
  10. 基于信息论的编码技术