#实现思路:
使用C语言调用windows的api,来实现对于电脑鼠标和某些键盘的记录,和模拟鼠标或者按键的按下弹起,而后将函数打包生成动态链接库供Python调用。Python在调用过程中使用到了ctypes库。最后因为C语言部分进行过多次调整而Python部分因为用不到这个东西就一直没有重写因此有些部分很混乱。
#代码部分:
#C语言部分:
1)模拟键盘操作:
此部分我们实现了模拟键盘的按下,弹起,按下弹起的操作
DLLIMPORT void K_du(int Jz)
{
keybd_event(Jz,0,0,0);
keybd_event(Jz,0,KEYEVENTF_KEYUP,0);
}
DLLIMPORT void K_d(int Jz)
{
keybd_event(Jz,0,0,0);
}
DLLIMPORT void K_u(int Jz)
{
keybd_event(Jz,0,KEYEVENTF_KEYUP,0);
}
keybd_event()函数为windows api在手册中可以查询到具体使用的方法。
2)模拟鼠标操作:
DLLIMPORT void M_movej(x,y)
//移动鼠标到绝对位置
{
SetCursorPos(x,y);
}
DLLIMPORT void M_movex(x,y)
//移动鼠标到相对位置
{
mouse_event(MOUSEEVENTF_MOVE,x,y,0,0);
}
DLLIMPORT void M_lu(x,y)
//模拟鼠标左键弹起
{
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
DLLIMPORT void M_ld(x,y)
//模拟鼠标左键按下
{
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
}
DLLIMPORT void M_ru(x,y)
//模拟鼠标右键弹起
{
mouse_event(MOUSEEVENT_RIGHTUP,0,0,0,0);
}
DLLIMPORT void M_rd(x,y)
//模拟鼠标右键按下
{
mouse_event(MOUSEEVENT_RIGHTDOWN,0,0,0,0);
}
DLLIMPORT void M_mu(x,y)
//模拟鼠标中键弹起
{
mouse_event(MOUSEEVENT_MIDDLEUP,0,0,0,0);
}
DLLIMPORT void M_md(x,y)
//模拟鼠标中键落下
{
mouse_event(MOUSEEVENT_MIDDLEOWN,0,0,0,0);
}
DLLIMPORT void M_ms()
{
mouse_event(MOUSEEVENTF_WHEEL, 0,0,1,NULL);
//此部分上下两个部分都可以实现模拟鼠标滑轮的操作任选其一
POINT Mouse_xy;
GetCursorPos(&Mouse_xy);
HWND mainWindow=WindowFromPoint(Mouse_xy);
SendMessage(mainWindow,WM_MOUSEWHEEL,WHEEL_DELTA<<16,0);
}
DLLIMPORT void M_mx()
{
mouse_event(MOUSEEVENTF_WHEEL, 0,0,-1,NULL);
//此部分上下两个部分都可以实现模拟鼠标滑轮的操作任选其一
POINT Mouse_xy;
GetCursorPos(&Mouse_xy);
HWND mainWindow=WindowFromPoint(Mouse_xy);
SendMessage(mainWindow,WM_MOUSEWHEEL,-WHEEL_DELTA<<16,0);
}
DLLIMPORT long G_mousex()//获得鼠标位置的横坐标
{
long x,y;
POINT mxy;
GetCursorPos(&mxy);
x=mxy.x;
//y=mxy.y;
return x;
}
DLLIMPORT long G_mousey()//获得鼠标位置的纵坐标
{
long x,y;
POINT mxy;
GetCursorPos(&mxy);
//x=mxy.x;
y=mxy.y;
return y;
}
3)判断操作:
DLLIMPORT int J_board(int boardcode)//boardcode是相应按键的键值
{
int T;
T=GetKeyState(boardcode);/*GetKeyState()函数可以判断按键的状态,返回四个参数0,1,-127,-128分别代表相应按键的按下或者弹起*/
if(T==0||T==1)
{
return 0;
}
else if(T==-127||T==-128)
{
return 1;
}
}
以上函数最后均生成了dll动态链接库。因此函数名之前多了一个DLLIMPORT
#python部分
Base
#2020/12/4
'''
加入了Judge类判断鼠标左键和NumLock键按下弹起
'''
import ctypes
R=ctypes.WinDLL(".\DLL\Remove_m.dll")
K=ctypes.WinDLL(".\DLL\Keyboard.dll")
M=ctypes.WinDLL(".\DLL\Mouse.dll")
C=ctypes.WinDLL(".\DLL\Ctrl.dll")
J=ctypes.WinDLL(".\DLL\J_MouseR.dll")
N=ctypes.WinDLL(".\DLL\J_numlock.dll")
Ct=ctypes.WinDLL(".\DLL\J_ctrl.dll")
class Mouse:
def rdu(self):
M.Mr_du()
def ld(self):
M.Ml_d()
def lu(self):
M.Ml_u()
def remove(self,x,y):
'''在x,y方向上移动距离'''
if x>=0:
for i in range(x):
M.I_mouse(0,0,1,0,0)
elif x<0:
for i in range(-x):
M.I_mouse(0,0,0,1,0)
if y>=0:
for i in range(y):
M.I_mouse(1,0,0,0,0)
elif y<0:
for i in range(-y):
M.I_mouse(0,1,0,0,0)
def flash(self,x,y):
'''移动到x,y坐标位置'''
R.Remove_m(x,y)
def get_x(self):
return M.Gmouse_x()
def get_y(self):
return M.Gmouse_y()
class Keyboard:
def kud(self,jz):
K.Keyboard_ud(jz)
def ku(self,jz):
K.Keyboard_u(jz)
def kd(self,jz):
K.Keyboard_d(jz)
class Txt:
def copy(self,Str):
C.Ctrl_C(bytes(Str,encoding="gbk"))
class Judge:
def judge_mr(self):
return J.J_Mr()
def judge_numlock(self):
return N.J_numlock()
def judge_ctrl(self):
return Ct.J_ctrl()
datachange
def datachange(filename):
f=open(filename+".txt","r")
line=f.readline()
otxtline=[]
while line:
otxtline.append(line)
line=f.readline()
f.close()
f=open(filename+"copy"+".txt","a")
for i in range(len(otxtline)-3):
str1=otxtline[i]
str2=otxtline[i+1]
str3=otxtline[i+2]
if str2[12]=="0":
if str1[12]=="1":
f.write(str2)
elif str2[12]=="1":
if str1[12]=="0" or str3[12]=="0":
f.write(str2)
f.close()
delete
import ctypes
G=ctypes.WinDLL(".\DLL\Gmouse.dll")
def Getmousepos():
print('x坐标:'+str(G.Gmouse_x()))
print('y坐标:'+str(G.Gmouse_y()))
main
#2020/12/6
#0.2版本
#2020/12/7
#导入read03模块,读取文件夹中脚本文件和记录文件
#改进delete命令
import delete
import Memory
import R_main
import script
import Getmousepos
import read03
import datachange
while True:
order=input("命令:")
if order=="delete":
filetype=input("文件类型:")
delete.delete(filetype)
elif order=="script":
filename=input("文件名:")
print("脚本正在生成")
script.script(filename)
print("脚本已经生成")
elif order=="write":
x=int(input("输入x坐标:"))
y=int(input("输入y坐标:"))
filename=input("输入预文件名:")
R_main.R_main(filename+".txt",x,y)
elif order=="memory":
filename=input("文件名称:")
Memory.memory(filename+".txt")
elif order=="mousexy":
Getmousepos.Getmousepos()
elif order=="exec":
S1=input("输入代码:")
S2=input("输入代码:")
exec(S1+'\n'+S2)
elif order=="readall":
read03.read_all()
elif order=="data":
filename=input("输入文件名:")
datachange.datachange(filename)
else:
print("指令不存在!")
Memory
#2020/12/5
#模块名:Memory
#记录鼠标的活动生成记录文件
import Base
import time
M=Base.Mouse()
J=Base.Judge()
def memory(filename):
file=open(filename,'a')
while True:
if J.judge_numlock()==1:
break
else:
if J.judge_ctrl()==1:
time.sleep(0.02)
file.write(time.strftime("%H:%M:%S",time.localtime())+" 状态:"+str(J.judge_mr())+" 位置坐标:"+'('+str(M.get_x())+','+str(M.get_y())+')'+'c'+'\n')
else:
time.sleep(0.02)
file.write(time.strftime("%H:%M:%S",time.localtime())+" 状态:"+str(J.judge_mr())+" 位置坐标:"+'('+str(M.get_x())+','+str(M.get_y())+')'+'\n')
file.close()
R_main
#2020/12/5
#2020/12/8
#加入r_main()特定输入
#模块名:R_main
#将名为filename的文件逐行读取并且放入剪切板里面
import Base
import random
def OutPut(Str,M_x,M_y):
C=Base.Txt()
K=Base.Keyboard()
M=Base.Mouse()
C.copy(Str)
M.flash(M_x,M_y)
M.ld()
M.lu()
K.kd(17)
K.kud(86)
K.ku(17)
#这个函数实现鼠标移动到某个位置然后单击后输入剪切板内的内容
def InPut(filename):
file=open(filename)
line=file.readline()
filetxt=[]
while line:
filetxt.append(line)
line=file.readline()
file.close()
return filetxt
#将txt文件中的内容赋值到列表里面
def R_main(filename,x,y):
Str=InPut(filename)[random.randint(0,len(InPut(filename))-1)]
OutPut(Str,x,y)
def r_main(filename,x,y,i):
Str=InPut(filename)[i]
OutPut(Str,x,y)
read03
#2020/12/5
#2020/12/8
#加入r_main()特定输入
#模块名:R_main
#将名为filename的文件逐行读取并且放入剪切板里面
import Base
import random
def OutPut(Str,M_x,M_y):
C=Base.Txt()
K=Base.Keyboard()
M=Base.Mouse()
C.copy(Str)
M.flash(M_x,M_y)
M.ld()
M.lu()
K.kd(17)
K.kud(86)
K.ku(17)
#这个函数实现鼠标移动到某个位置然后单击后输入剪切板内的内容
def InPut(filename):
file=open(filename)
line=file.readline()
filetxt=[]
while line:
filetxt.append(line)
line=file.readline()
file.close()
return filetxt
#将txt文件中的内容赋值到列表里面
def R_main(filename,x,y):
Str=InPut(filename)[random.randint(0,len(InPut(filename))-1)]
OutPut(Str,x,y)
def r_main(filename,x,y,i):
Str=InPut(filename)[i]
OutPut(Str,x,y)
script
#2020/12/5
#模块名:script
#读取记录文件生成脚本文件
import time
#这个部分将记录文件读出来
def script(filename):
file=open(filename+".txt",'r')
line=file.readline()
Fileline=[]
while line:
Fileline.append(line)
line=file.readline()
file.close()
#-----------------------#
f=open("S_cript.py","a")
#这个部分写入脚本的头文件
f.write("import Base\n")
f.write("import time\n")
f.write("import R_main\n")
f.write("M=Base.Mouse()\n")
f.write("K=Base.Keyboard()\n")
f.write("def script():\n")
#-----------------------#
for i in range(len(Fileline)):
Str=Fileline[i]
StrState=Str[12]
StrCtrl=Str[-2]
for x in range(len(Str)):
if Str[x]=="(":
start=x
if Str[x]==",":
end=x
if Str[x]==")":
end_t=x
Str_x=Str[start+1:end]
Str_y=Str[end+1:end_t]
f.write("\tM.flash"+"("+str(Str_x)+","+str(Str_y)+")"+"\n")
if StrState=="0":
f.write("\tM.lu()\n")
elif StrState=="1":
f.write("\tM.ld()\n")
if StrCtrl=="c":
f.write("\tR_main.R_main("+"\"预文件.txt\""+","+str(Str_x)+","+str(Str_y)+')\n')
f.write("\ttime.sleep"+"("+"0.02"+")"+"\n")
f.close()
#for i in range(len(Fileline)):
# print(Fileline[i])
python部分可能比较乱可以通过main来进行梳理。
抱拳了老铁。