来源于网上  参考 https://www.cnblogs.com/fuhua/p/5877781.html 等众多文章

详情取看我第二个例子封装功能较多 https://www.cnblogs.com/xuexidememeda/p/10392528.html

内容包括

取窗口句柄

移动窗口

读写内存整数型

读写内存小数型

写写内存字节集

取空白字节集

取进程句柄

字节集转小数型

根据名称取进程PID

获取模块地址

取窗口句柄

取窗口位置返回RECT

画方框

画直线

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks; namespace GDI1.Util
{
class GameUtil
{ [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
public static extern int _MemoryReadByteSet(int hProcess, int lpBaseAddress, byte[] lpBuffer, int nSize, int lpNumberOfBytesRead); [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
public static extern int _MemoryReadInt32(int hProcess, int lpBaseAddress, ref int lpBuffer, int nSize, int lpNumberOfBytesRead); [DllImport("kernel32.dll", EntryPoint = "WriteProcessMemory")]
public static extern int _MemoryWriteByteSet(int hProcess, int lpBaseAddress, byte[] lpBuffer, int nSize, int lpNumberOfBytesWritten); [DllImport("kernel32.dll", EntryPoint = "WriteProcessMemory")]
public static extern int _MemoryWriteInt32(int hProcess, int lpBaseAddress, ref int lpBuffer, int nSize, int lpNumberOfBytesWritten); [DllImport("kernel32.dll", EntryPoint = "GetCurrentProcess")]
public static extern int GetCurrentProcess(); [DllImport("kernel32.dll", EntryPoint = "OpenProcess")]
public static extern int OpenProcess(int dwDesiredAccess, int bInheritHandle, int dwProcessId); [DllImport("kernel32.dll", EntryPoint = "CloseHandle")]
public static extern int CloseHandle(int hObject); [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")]
public static extern int _CopyMemory_ByteSet_Float(ref float item, ref byte source, int length);
const int PROCESS_POWER_MAX = ; [DllImport("kernel32.dll ")]
public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, float[,] lpBuffer, int nSize, out int lpNumberOfBytesRead); [DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); [StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left; //最左坐标
public int Top; //最上坐标
public int Right; //最右坐标
public int Bottom; //最下坐标
} //打开进程
//kernel32.dll系统动态链接库
[DllImportAttribute("kernel32.dll", EntryPoint = "OpenProcess")]
public static extern IntPtr OpenProcess
(
int iAccess,
bool Handle,
int ProcessID
);
//关闭句柄
[DllImport("kernel32.dll", EntryPoint = "CloseHandle")]
private static extern void CloseHandle
(
IntPtr hObject
);
//取窗口句柄 FindWindow
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public extern static IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("User32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
//移动窗口
/// <summary>
/// 设置目标窗体大小,位置
/// </summary>
/// <param name="hWnd">目标句柄</param>
/// <param name="x">目标窗体新位置X轴坐标</param>
/// <param name="y">目标窗体新位置Y轴坐标</param>
/// <param name="nWidth">目标窗体新宽度</param>
/// <param name="nHeight">目标窗体新高度</param>
/// <param name="BRePaint">是否刷新窗体</param>
/// <returns></returns>
/// 移动窗口
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);
//--------------------------------------------------------------------------------------------------------------- /// <summary>
/// 读内存整数型
/// </summary>
/// <param name="pID">进程ID</param>
/// <param name="bAddress">0x地址</param>
/// <returns>0失败</returns>
public static int ReadMemoryInt32(int pID, int bAddress)
{
int num = ;
int handle = getProcessHandle(pID);
int num3 = GameUtil._MemoryReadInt32(handle, bAddress, ref num, , );
GameUtil.CloseHandle(handle);
if (num3 == )
{
return ;
}
else
{
return num;
}
} /// <summary>
/// 写内存整数型
/// </summary>
/// <param name="pID">进程ID</param>
/// <param name="bAddress">0x地址</param>
/// <param name="value">写入值</param>
/// <returns>false失败 true成功</returns>
public static bool WriteMemoryInt32(int pID, int bAddress, int value)
{
int handle = getProcessHandle(pID);
int num2 = GameUtil._MemoryWriteInt32(handle, bAddress, ref value, , );
GameUtil.CloseHandle(handle);
return num2 != ;
} /// <summary>
/// 读内存小数型
/// </summary>
/// <param name="pID">进程ID</param>
/// <param name="bAddress">0x地址</param>
/// <returns>0失败</returns>
public static float ReadMemoryFloat(int pID, int bAddress)
{
//byte[] array = test.GetVoidByteSet(4);
byte[] array = new byte[];//不取空字节集也可以正确转换成单精度小数型
int handle = getProcessHandle(pID);
int temp = GameUtil._MemoryReadByteSet(handle, bAddress, array, , );
if (temp == )
{
return 0f;
}
else
{
return GameUtil.getFloatFromByteSet(array, );
}
} /// <summary>
/// 写内存小数型
/// </summary>
/// <param name="pID">进程ID</param>
/// <param name="bAddress">0x地址</param>
/// <param name="value">写入数据</param>
/// <returns>false失败</returns>
public static bool WriteMemoryFloat(int pID, int bAddress, float value)
{
//byte[] byteSet = test.GetByteSet(value);
byte[] byteSet = BitConverter.GetBytes(value);//https://msdn.microsoft.com/en-us/library/yhwsaf3w
//byte[] byteSet = Encoding.GetEncoding("gb2312").GetBytes(value.ToString());
return GameUtil.WriteMemoryByteSet(pID, bAddress, byteSet, );
} /// <summary>
/// 写内存字节集
/// </summary>
/// <param name="pID">进程ID</param>
/// <param name="bAddress">0x地址</param>
/// <param name="value">字节数据</param>
/// <param name="length">写入长度 0代表字节数据的长度</param>
/// <returns>false失败</returns>
private static bool WriteMemoryByteSet(int pID, int bAddress, byte[] value, int length = )
{
int handle = GameUtil.getProcessHandle(pID);
int nSize = (length == ) ? value.Length : length;
int tmp = GameUtil._MemoryWriteByteSet(handle, bAddress, value, nSize, );//byte[]属于引用类型 引用类型不用ref也是以传址方式进行运算
//test.CloseHandle(pID);
return tmp != ;
} /// <summary>
/// 取空白字节集
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
public static byte[] getVoidByteSet(int num)
{
if (num <= )
{
num = ;
}
string text = "";
for (int i = ; i < num; i++)
{
text += "";
}
return Encoding.UTF8.GetBytes(text);
} /// <summary>
/// 取进程句柄
/// </summary>
/// <param name="pID">进程ID</param>
/// <returns>进程句柄</returns>
public static int getProcessHandle(int pID)
{
if (pID == -)
{
return GameUtil.GetCurrentProcess();
}
else
{
return GameUtil.OpenProcess(PROCESS_POWER_MAX, , pID);
}
} /// <summary>
/// 字节集转小数型
/// </summary>
/// <param name="sourceValue">字节集</param>
/// <param name="index">索引</param>
/// <returns></returns>
public static float getFloatFromByteSet(byte[] sourceValue, int index)
{
float result = 0f;
GameUtil._CopyMemory_ByteSet_Float(ref result, ref sourceValue[index], );
return result;
} /// <summary>
/// 获取字节集
/// </summary>
/// <param name="data">需要转换到字节集的数据</param>
/// <returns></returns>
public static byte[] getByteSet(float data)
{
return Encoding.UTF8.GetBytes(data.ToString());
} //根据名称取进程PID 不得有后缀.exe
//根据进程名获取PID 不得有后缀.exe
public static int getPidByProcessName(string processName)
{
Process[] ArrayProcess = Process.GetProcessesByName(processName);
foreach (Process pro in ArrayProcess)
{
return pro.Id;
}
return ;
}
//获取模块地址 可以是dll或者exe程序
public static int getMoudleAddress(string processName ,string dllname )
{
foreach (Process p in Process.GetProcessesByName(processName))
{ foreach (ProcessModule m in p.Modules)
{
if (m.ModuleName.Equals(dllname))
return (int)m.BaseAddress;
} }
return ;
}
//取窗口句柄 这里传入的值是窗口标题 和窗口类名
public static IntPtr getWindowsHandler_findwindow(String classname,String windowtitle)
{
IntPtr maindHwnd = FindWindow(classname, windowtitle); //获得QQ登陆框的句柄 return maindHwnd; }
//取窗口位置返回RECT
public static RECT getWindowsRect(IntPtr windowsHandler)
{
RECT rec = new RECT();
GetWindowRect(windowsHandler, ref rec);//h为窗口句柄 return rec;
} //画方框
public static void drawRectangle(Graphics g,int x,int y,int width,int heigth ,Color color,float px)
{
Pen pen = new Pen(color, px);
g.DrawRectangle(pen, x, y, width, heigth); }
//画直线
public static void drawLine(Graphics g, int x, int y, int x1, int y1, Color color, float px)
{
Pen pen = new Pen(color, px); g.DrawLine(pen, new Point(x, y), new Point(x1, y1)); } }
}

c# 外挂操作(内存操作)(内存读写取窗口句柄移动窗口取模块地址)工具类的更多相关文章

  1. 分享自研实现的多数据源(支持同DB不同表、跨DB表、内存数据、外部系统数据等)分页查询工具类实现原理及使用

    思考: 提起分页查询,想必任何一个开发人员(不论是新手还是老手)都能快速编码实现,实现原理再简单不过,无非就是写一条SELECT查询的SQL语句,ORDER BY分页排序的字段, 再结合limit ( ...

  2. swift语言之多线程操作和操作队列(下)———坚持51天吃掉大象(写技术文章)

    欢迎有兴趣的朋友,参与我的美女同事发起的活动<51天吃掉大象>,该美女真的很疯狂,希望和大家一起坚持51天做一件事情,我加入这个队伍,希望坚持51天每天写一篇技术文章.关注她的微信公众号: ...

  3. c#读写共享内存操作函数封装

    原文 c#读写共享内存操作函数封装 c#共享内存操作相对c++共享内存操作来说原理是一样,但是c#会显得有点复杂. 现把昨天封装的读写共享内存封装的函数记录下来,一方面希望给需要这块的有点帮助,另一方 ...

  4. java并发编程(十七)内存操作总结

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17377197 主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则, ...

  5. java 21-11 数据输入、输出流和内存操作流

    IO数据流: 可以读写基本数据类型的数据 数据输入流:DataInputStream DataInputStream(InputStream in)   数据输出流:DataOutputStream ...

  6. Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)

    1.操作基本数据类型的流     1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...

  7. clients(PV操作共享内核内存进行输入输出分屏) - server(进程间通信)模型实现

    1.拓扑结构 2.PV操作共享内核内存进行输入输出分屏 (1) int semop(int semid,struct sembuf *sops,size_t nsops): 功能描述 操作一个或一组信 ...

  8. C语言嵌入式系统编程修炼之三:内存操作

    数据指针 在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力.在嵌入式系统的实际调试中,多借助C语言指针所具 ...

  9. 转: 【Java并发编程】之十七:深入Java内存模型—内存操作规则总结

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17377197 主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则, ...

随机推荐

  1. docker-compose 快速部署持续集成测试环境 Gitlab+Harbor+Jenkins pipeline 实现 tag run docker Images

    环境 测试部署主机IP:192.168.1.1 Jenkins主机IP:192.168.1.2 Harbor主机IP:192.168.1.3 Gitlab主机IP:192.168.0.10 系统信息: ...

  2. docker进入交互界面

    进入cmd交互界面 docker run -it python:3.5 /bin/bash 退出 exit ctrl + d

  3. android.view.WindowManager$BadTokenException 崩掉

    问题: 以前的项目,今天打开运行,Activity刚打开的时候,点开一个弹窗是好的,但是再点到另一个界面的时候,返回,再点弹窗就崩了. 解决: 网上查了一下,发现出现这个问题的还特别多,大体如下: 1 ...

  4. Reversing-x64Elf-100----攻防世界

    题目来源:攻防世界 环境:win10 软件:pycharm.64位的ida 常规的操作ida打开查看,看到了main函数,

  5. 2.Git知识

    Git安装 Git在不同的操作系统上安装是不一样的,这里只讲解我们需要的,也就是在Windows下的安装,主要安装msysGit和TortoiseGit 安装msysGit,到https://code ...

  6. IDEA设置窗口标签换行显示

    windows -> editor tabs -> tabs placement 关掉 show tabs in sigle row即可

  7. JSP数据交互二

    1.JSP内置对象:JSP内置对象是 Web 容器创建的一组对象,不用通过手动new就可以使用2.JSP9大内置对象:      对象名称 类型 request (请求对象)  javax.servl ...

  8. 多个span标签在同一行显示

    属性设置为display:inline或display:inline-block

  9. mybatis查询时间段

    参考:https://bbs.csdn.net/topics/391838987 <!-- 查询条件:创建开始时间 --> <if test="createdBeginti ...

  10. ADV-298 和谐宿舍2 动态规划

    和谐宿舍2 问题描述 我的某室友学过素描,墙上有n张他的作品.这些作品都是宽度为1,高度不定的矩形,从左到右排成一排,且底边在同一水平线上. 宿舍评比就要来了,为了及格,我们决定买不多于m块的矩形木板 ...