依赖库安装:
conda install pywin32
实现:
import ctypes
import win32api
from win32con import PROCESS_ALL_ACCESS # 权限
import win32process
import sys
class MemWrite:
def __init__(self, window_name):
self.handle = ctypes.windll.user32.FindWindowW(None, window_name)
hpid, pid = win32process.GetWindowThreadProcessId(self.handle)
self.hProcess = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid) # 获取进程句柄
# print(self.handle,self.hProcess,hpid,pid)
def read(self, mem_address, data_len=4, data_type=''):
if data_type == 'int':
addr = ctypes.c_int32()
elif data_type == 'float':
addr = ctypes.c_float()
elif data_type == 'double':
addr = ctypes.c_double()
data_len = 8
else:
addr = ctypes.c_ulong()
# 句柄,地址,返回值,长度
ctypes.windll.kernel32.ReadProcessMemory(int(self.hProcess), ctypes.c_void_p(mem_address), ctypes.byref(addr), data_len, None)
# print(addr)
return addr.value
def write(self, mem_address, num, data_len=4, data_type=''):
if data_type == 'int':
addr = ctypes.c_int32()
elif data_type == 'float':
addr = ctypes.c_float()
elif data_type == 'double':
addr = ctypes.c_double()
data_len = 8
else:
addr = ctypes.c_ulong()
addr.value = num
# 句柄,地址,写入值,长度
return ctypes.windll.kernel32.WriteProcessMemory(
int(self.hProcess), ctypes.c_void_p(mem_address), ctypes.byref(addr), data_len, None
)
write返回布尔表示是否写成功