python为什么叫爬虫_python根据句柄进行点击

python为什么叫爬虫_python根据句柄进行点击Pywin32是一个Python库,为python提供访问WindowsAPI的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等。1.通过类名和标题查找窗口句柄,并获得窗口位置和大小importwin32guiimportwin32apiclassname=”MozillaWindowClass”titlename=”百度一下,你就知道-MozillaFire…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

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

python为什么叫爬虫_python根据句柄进行点击

import win32gui

import win32api

classname = “MozillaWindowClass”

titlename = “百度一下,你就知道 – Mozilla Firefox”

#获取句柄

hwnd = win32gui.FindWindow(classname, titlename)

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

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

python为什么叫爬虫_python根据句柄进行点击

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

python为什么叫爬虫_python根据句柄进行点击

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)

python为什么叫爬虫_python根据句柄进行点击

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还可用于监听鼠标和键盘事件的输入

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/183242.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 查找-散列查找

    查找-散列查找1.散列的相关概念散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。这里我们把这种对应关系f称为散列函数,又称为哈希(Hash)函数。按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为

  • 使用es6模板字符串嵌入变量,并实现循环「建议收藏」

    使用es6模板字符串嵌入变量,并实现循环「建议收藏」模板字符串支持嵌入变量,只需要将变量名写在${}之中。在模板字符串中,遍历数组,生成循环结构。letarr=[‘aaa’,’bbbb’,’c’,’dd’,’f’]lettemp=`<ul>${arr.map(item=>{return`<li>${item}</li>`}).join(”)}</ul>`console.log(temp);/*<ul><li>aa

  • Linux宝塔面板安装

    Linux宝塔面板安装

  • Linux04:(4.6k)vim编辑器「建议收藏」

    Linux04:(4.6k)vim编辑器「建议收藏」文章目录Linux_day04一.vim编辑器vim的三种模式1.命令模式2.末行模式3.编辑模式实用功能扩展内容==1.vim的配置文件==2.异常退出问题3.别名机制4.退出方式补充一些win10下的快捷键Linux_day04一.vim编辑器vim的三种模式命令模式不能对文件直接编辑,但可以通过快捷键删除行,复制,粘贴,移动光标等编辑模式-输入末行模式可以在末行输入命令:搜索,替换,保存,退出,撤销vim打开文件的方式:1.#vim 文件路径——直接打开文件(光

  • Linux学习——yum学习和光盘yum源搭建「建议收藏」

    yum安装和光盘yum源搭建在rmp安装的时代,rpm包依赖让安装人员头大,而且头疼,有了yum后整个的安装更加简单和方便。

  • 使用 EasyPOI 优雅导出Excel模板数据(含图片)

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:星悬月 blog.csdn.net/u012441819/article/details/96828044 E…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号