Python实现按键精灵部分功能

#实现思路:
使用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来进行梳理。
抱拳了老铁。

猜你喜欢

转载自blog.csdn.net/L_Mu2000/article/details/110953448