封装的有问题 其中方框可能在别的方向可能 会显示不出来建议不要下载了 抽时间我会用纯c#写一个例子的 

其中绘制方框文字和直线调用的外部dll采用DX11(不吃CUP)绘制我封装成了DLL命名为 SoftwareHelper.dll 把他和你软件放置同一目录调用即可

其中dll是易语言调用别人DX11模块编译的(采用黑月编译体积小不容易报毒)封装了一些基本功能 需要的请自行添加 易语言代码如下(相关文件我将会传上去)

  1. .版本
  2.  
  3. .程序集 程序集1
  4.  
  5. .子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码
  6.  
  7. _临时子程序 () ' 在初始化代码执行完毕后调用测试代码
  8. 返回 () ' 返回值被忽略。
  9.  
  10. .子程序 _临时子程序
  11.  
  12. ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
  13.  
  14. .子程序 InitDX11, , 公开, 初始化成功为真 否则 为假
  15. .参数 字体大小, 整数型, , 默认17
  16.  
  17. 初始化Dx11 (字体大小)
  18.  
  19. .子程序 SafetyQuit, , 公开, 退出调用
  20.  
  21. 安全退出 ()
  22.  
  23. .子程序 SetWindowPos_Top, 逻辑型, 公开, 设置窗口在最顶端,成功返回真,失败返回假
  24. .参数 handle, 整数型, , 欲设置的窗口句柄
  25.  
  26. 返回 (窗口_置顶 (handle))
  27.  
  28. .子程序 MoveWindows, , 公开, 移动指定窗口(无返回值)
  29. .参数 handle, 整数型, , 欲移动窗口的句柄
  30. .参数 newleft, 整数型, , 可空:原左边不变
  31. .参数 newtop, 整数型, , 可空:原顶边不变
  32. .参数 newwidth, 整数型, , 可空:原宽度不变
  33. .参数 newheight, 整数型, , 可空:原高度不变
  34.  
  35. 窗口移动 (handle, newleft, newtop, newwidth, newheight)
  36.  
  37. .子程序 DrawText, , 公开
  38. .参数 X, 整数型
  39. .参数 Y, 整数型
  40. .参数 text, 文本型
  41. .参数 color, 整数型
  42.  
  43. 绘制文本 (X, Y, text, color, )
  44.  
  45. .子程序 DrawLine, , 公开
  46. .参数 开始X, 整数型
  47. .参数 开始Y, 整数型
  48. .参数 结束x, 整数型
  49. .参数 结束y, 整数型
  50. .参数 线宽, 整数型
  51. .参数 颜色, 整数型
  52.  
  53. 绘制直线 (开始X, 开始Y, 结束x, 结束y, 线宽, 颜色, )
  54.  
  55. .子程序 ProcessIsExist, 逻辑型, 公开, 判断指定进程是否存在(此判断与进程其它信息无关联)(存在返回真,不存在或失败返回假)
  56. .参数 进程名, 文本型, , 欲检测的进程名(不区分大小写)
  57.  
  58. 返回 (进程是否存在 (进程名))
  59.  
  60. .子程序 DrawSquare, , 公开
  61. .参数 X, 整数型
  62. .参数 Y, 整数型
  63. .参数 W, 整数型
  64. .参数 H, 整数型
  65. .参数 外框颜色, 整数型
  66. .参数 内框颜色, 整数型
  67. .参数 线宽, 整数型
  68.  
  69. 描边方框 (X, Y, W, H, 外框颜色, 内框颜色, 线宽, )
  70.  
  71. .子程序 GetDX11CreateWindowHandle, 整数型, 公开, (这两个参数不用填一般也能取到)为了防止重复和枚举窗口名称为 DX11t?h?i?s? ?i?s? ?y?o?u? ?w?i?n?d?o?w?
  72.  
  73. 返回 (取DX11创建的透明窗口句柄 (, ))
  74.  
  75. .子程序 OptimizeCUP, , 公开, 优化cpu
  76. .参数 时间, 整数型, , 毫秒
  77.  
  78. 优化CUP (时间)
  79.  
  80. .子程序 OptimizeDelayed, , 公开, 优化延时
  81. .参数 时间, 整数型, , 毫秒
  82.  
  83. 优化延时 (时间)
  84.  
  85. .子程序 OptimizeSystem, , 公开, 比普通的处理事件速度要快3倍左右;
  86.  
  87. 系统_处理事件 ()
  88.  
  89. .子程序 StartDrawing, , 公开
  90.  
  91. 开始绘图 ()
  92.  
  93. .子程序 EndDrawing, , 公开
  94.  
  95. 结束绘图 ()
  96.  
  97. .子程序 MouseMoveInGame, , 公开, SendInput模拟鼠标移动(无返回值)目标坐标与实际坐标有一像素点误差属正常现象!
  98. .参数 窗口句柄, 整数型, , 可空:相对桌面移动鼠标 句柄有效则相对窗口中坐标移动
  99. .参数 水平坐标, 整数型
  100. .参数 垂直坐标, 整数型
  101.  
  102. 鼠标移动2 (窗口句柄, 水平坐标, 垂直坐标)

c# 调用dll封装类

  1. class DllHelper
  2. {
  3. public const int COLORBLACK = ;//黑色
  4. public const int COLORWHITE = ;//#白色
  5. public const int COLORPINKISHRED = ;//#品红
  6. public const int COLORCYAN = ;//#藏青
  7. public const int COLORGREEN = ;//#墨绿
  8. public const int COLORDEEPCYAN = ;//#深青
  9. public const int COLORYELLOW = ;//#黄色
  10. public const int COLORBLUE = ;//#蓝色
  11. public const int COLORRED = ;//#红色
  12. public const int COLOGRAY = ;//#灰色
  13. public const int COLOORANGE = ;//#橙黄
  14.  
  15. [DllImport("SoftwareHelper.dll", EntryPoint = "InitDX11")]
  16. public static extern void InitDX11(int wordsize);//初始化一个dx11透明窗口参数为字体大小建议15
  17. [DllImport("SoftwareHelper.dll", EntryPoint = "SafetyQuit")]
  18. public static extern void SafetyQuit();//安全退出放在窗口是否可以被关闭事件卸载绘图
  19. [DllImport("SoftwareHelper.dll", EntryPoint = "SetWindowPos_Top")]
  20. public static extern bool SetWindowPos_Top(int handle);//设置窗口置顶参数为窗口句柄
  21. [DllImport("SoftwareHelper.dll", EntryPoint = "MoveWindows")]
  22. public static extern void MoveWindows(int handle,int newleft,int newtop,int newwidth,int newheight);//移动窗口 窗口句柄 窗口左边 窗口顶部 窗口高度宽度
  23. [DllImport("SoftwareHelper.dll", EntryPoint = "DrawText")]//写字
  24. public static extern void DrawText(int X, int Y, string text, int color); //屏幕xy 和文本 颜色用上面定义的常量
  25. [DllImport("SoftwareHelper.dll", EntryPoint = "DrawLine")]//画线
  26. public static extern void DrawLine(int X, int Y, int Xend, int Yend, int linePx, int color);//x为开始x坐标 x1为结束x坐标 linepx为线宽度 颜色用上面定义的常量
  27. [DllImport("SoftwareHelper.dll", EntryPoint = "ProcessIsExist")]//判断指定进程是否存在(此判断与进程其它信息无关联)(存在返回真,不存在或失败返回假)
  28. public static extern bool ProcessIsExist(string processname);//进程名称带后zhui
  29. [DllImport("SoftwareHelper.dll", EntryPoint = "DrawSquare")]//画出描边方框
  30. public static extern void DrawSquare(int X, int Y, int W, int H ,int colorout, int colorin,int linepx);//colorout外部方框颜色 in为内部 linepx线宽
  31. [DllImport("SoftwareHelper.dll", EntryPoint = "GetDX11CreateWindowHandle")]//得到对象dx11创建的透明窗口句柄 为了防止重复和游戏 枚举窗口名称为 DX11t?h?i?s? ?i?s? ?y?o?u? ?w?i?n?d?o?w?
  32. public static extern int GetDX11CreateWindowHandle();
  33. [DllImport("SoftwareHelper.dll", EntryPoint = "OptimizeCUP")]//优化cup防止绘制卡
  34. public static extern void OptimizeCUP(int time);//毫秒
  35. [DllImport("SoftwareHelper.dll", EntryPoint = "OptimizeDelayed")]//优化延时
  36. public static extern void OptimizeDelayed(int time);//毫秒
  37. [DllImport("SoftwareHelper.dll", EntryPoint = "OptimizeSystem")]//系统处理事件同样是为了优化cup防止卡
  38. public static extern void OptimizeSystem();
  39. [DllImport("SoftwareHelper.dll", EntryPoint = "StartDrawing")]//开始绘图 绘图前调用
  40. public static extern void StartDrawing();
  41.  
  42. [DllImport("SoftwareHelper.dll", EntryPoint = "EndDrawing")]//结束绘图 绘图结束调用
  43. public static extern void EndDrawing();
  44.  
  45. [DllImport("SoftwareHelper.dll", EntryPoint = "MouseMoveInGame")]//鼠标可以在游戏内移动游戏外部自瞄调用
  46. public static extern void MouseMoveInGame(int handle,int x,int y);//游戏窗口句柄 xy坐标
  47.  
  48. }

c#内存辅助类

  1. class GameUtil
  2. {
  3. public struct RECT
  4. {
  5. public int Left; //最左坐标
  6. public int Top; //最上坐标
  7. public int Right; //最右坐标
  8. public int Bottom; //最下坐标
  9. }
  10. public struct RECTClient
  11. {
  12. public uint Left;
  13. public uint Top;
  14. public uint Right;
  15. public uint Bottom;
  16. }
  17. public struct LPPOINT
  18. {
  19. public int x;
  20. public int y;
  21.  
  22. }
  23. [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
  24. public static extern int _MemoryReadByteSet(int hProcess, int lpBaseAddress, byte[] lpBuffer, int nSize, int lpNumberOfBytesRead);
  25.  
  26. [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
  27. public static extern int _MemoryReadInt32(int hProcess, int lpBaseAddress, ref int lpBuffer, int nSize, int lpNumberOfBytesRead);
  28.  
  29. [DllImport("kernel32.dll", EntryPoint = "WriteProcessMemory")]
  30. public static extern int _MemoryWriteByteSet(int hProcess, int lpBaseAddress, byte[] lpBuffer, int nSize, int lpNumberOfBytesWritten);
  31.  
  32. [DllImport("kernel32.dll", EntryPoint = "WriteProcessMemory")]
  33. public static extern int _MemoryWriteInt32(int hProcess, int lpBaseAddress, ref int lpBuffer, int nSize, int lpNumberOfBytesWritten);
  34.  
  35. [DllImport("kernel32.dll", EntryPoint = "GetCurrentProcess")]
  36. public static extern int GetCurrentProcess();
  37.  
  38. [DllImport("kernel32.dll", EntryPoint = "OpenProcess")]
  39. public static extern int OpenProcess(int dwDesiredAccess, int bInheritHandle, int dwProcessId);
  40.  
  41. [DllImport("kernel32.dll", EntryPoint = "CloseHandle")]
  42. public static extern int CloseHandle(int hObject);
  43.  
  44. [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")]
  45. public static extern int _CopyMemory_ByteSet_Float(ref float item, ref byte source, int length);
  46. const int PROCESS_POWER_MAX = ;
  47. [DllImport("kernel32.dll")]
  48. public static extern bool ReadProcessMemory(IntPtr hProcess, int lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesRead);
  49.  
  50. [DllImport("user32.dll")]
  51. [return: MarshalAs(UnmanagedType.Bool)]
  52. static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
  53.  
  54. [DllImport("user32")]
  55. public static extern bool GetClientRect(IntPtr hwnd,out RECTClient lpRect );
  56. [DllImport("user32")]
  57. public static extern bool ClientToScreen(IntPtr hwnd, out LPPOINT point);
  58. //打开进程
  59. //kernel32.dll系统动态链接库
  60. [DllImportAttribute("kernel32.dll", EntryPoint = "OpenProcess")]
  61. public static extern IntPtr OpenProcess
  62. (
  63. int iAccess,
  64. bool Handle,
  65. int ProcessID
  66. );
  67. //关闭句柄
  68. [DllImport("kernel32.dll", EntryPoint = "CloseHandle")]
  69. private static extern void CloseHandle
  70. (
  71. IntPtr hObject
  72. );
  73. //取窗口句柄 FindWindow
  74. [DllImport("User32.dll", EntryPoint = "FindWindow")]
  75. public extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
  76.  
  77. [DllImport("User32.dll", EntryPoint = "FindWindowEx")]
  78. public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
  79. //移动窗口
  80. /// <summary>
  81. /// 设置目标窗体大小,位置
  82. /// </summary>
  83. /// <param name="hWnd">目标句柄</param>
  84. /// <param name="x">目标窗体新位置X轴坐标</param>
  85. /// <param name="y">目标窗体新位置Y轴坐标</param>
  86. /// <param name="nWidth">目标窗体新宽度</param>
  87. /// <param name="nHeight">目标窗体新高度</param>
  88. /// <param name="BRePaint">是否刷新窗体</param>
  89. /// <returns></returns>
  90. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  91. public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);
  92. //---------------------------------------------------------------------------------------------------------------
  93.  
  94. /// <summary>
  95. /// 读内存整数型
  96. /// </summary>
  97. /// <param name="pID">进程ID</param>
  98. /// <param name="bAddress">0x地址</param>
  99. /// <returns>0失败</returns>
  100. public static int ReadMemoryInt32(int pID, int bAddress)
  101. {
  102. int num = ;
  103. int handle = getProcessHandle(pID);
  104. int num3 = GameUtil._MemoryReadInt32(handle, bAddress, ref num, , );
  105. GameUtil.CloseHandle(handle);
  106. if (num3 == )
  107. {
  108. return ;
  109. }
  110. else
  111. {
  112. return num;
  113. }
  114. }
  115.  
  116. /// <summary>
  117. /// 写内存整数型
  118. /// </summary>
  119. /// <param name="pID">进程ID</param>
  120. /// <param name="bAddress">0x地址</param>
  121. /// <param name="value">写入值</param>
  122. /// <returns>false失败 true成功</returns>
  123. public static bool WriteMemoryInt32(int pID, int bAddress, int value)
  124. {
  125. int handle = getProcessHandle(pID);
  126. int num2 = GameUtil._MemoryWriteInt32(handle, bAddress, ref value, , );
  127. GameUtil.CloseHandle(handle);
  128. return num2 != ;
  129. }
  130.  
  131. /// <summary>
  132. /// 读内存小数型
  133. /// </summary>
  134. /// <param name="pID">进程ID</param>
  135. /// <param name="bAddress">0x地址</param>
  136. /// <returns>0失败</returns>
  137. public static float ReadMemoryFloat(int pID, int bAddress)
  138. {
  139. //byte[] array = test.GetVoidByteSet(4);
  140. byte[] array = new byte[];//不取空字节集也可以正确转换成单精度小数型
  141. int handle = getProcessHandle(pID);
  142. int temp = GameUtil._MemoryReadByteSet(handle, bAddress, array, , );
  143. if (temp == )
  144. {
  145. return 0f;
  146. }
  147. else
  148. {
  149. return GameUtil.getFloatFromByteSet(array, );
  150. }
  151. }
  152.  
  153. /// <summary>
  154. /// 写内存小数型
  155. /// </summary>
  156. /// <param name="pID">进程ID</param>
  157. /// <param name="bAddress">0x地址</param>
  158. /// <param name="value">写入数据</param>
  159. /// <returns>false失败</returns>
  160. public static bool WriteMemoryFloat(int pID, int bAddress, float value)
  161. {
  162. //byte[] byteSet = test.GetByteSet(value);
  163. byte[] byteSet = BitConverter.GetBytes(value);//https://msdn.microsoft.com/en-us/library/yhwsaf3w
  164. //byte[] byteSet = Encoding.GetEncoding("gb2312").GetBytes(value.ToString());
  165. return GameUtil.WriteMemoryByteSet(pID, bAddress, byteSet, );
  166. }
  167.  
  168. /// <summary>
  169. /// 写内存字节集
  170. /// </summary>
  171. /// <param name="pID">进程ID</param>
  172. /// <param name="bAddress">0x地址</param>
  173. /// <param name="value">字节数据</param>
  174. /// <param name="length">写入长度 0代表字节数据的长度</param>
  175. /// <returns>false失败</returns>
  176. private static bool WriteMemoryByteSet(int pID, int bAddress, byte[] value, int length = )
  177. {
  178. int handle = GameUtil.getProcessHandle(pID);
  179. int nSize = (length == ) ? value.Length : length;
  180. int tmp = GameUtil._MemoryWriteByteSet(handle, bAddress, value, nSize, );//byte[]属于引用类型 引用类型不用ref也是以传址方式进行运算
  181. //test.CloseHandle(pID);
  182. return tmp != ;
  183. }
  184.  
  185. /// <summary>
  186. /// 取空白字节集
  187. /// </summary>
  188. /// <param name="num"></param>
  189. /// <returns></returns>
  190. public static byte[] getVoidByteSet(int num)
  191. {
  192. if (num <= )
  193. {
  194. num = ;
  195. }
  196. string text = "";
  197. for (int i = ; i < num; i++)
  198. {
  199. text += "";
  200. }
  201. return Encoding.UTF8.GetBytes(text);
  202. }
  203.  
  204. /// <summary>
  205. /// 取进程句柄
  206. /// </summary>
  207. /// <param name="pID">进程ID</param>
  208. /// <returns>进程句柄</returns>
  209. public static int getProcessHandle(int pID)
  210. {
  211. if (pID == -)
  212. {
  213. return GameUtil.GetCurrentProcess();
  214. }
  215. else
  216. {
  217. return GameUtil.OpenProcess(PROCESS_POWER_MAX, , pID);
  218. }
  219. }
  220.  
  221. /// <summary>
  222. /// 字节集转小数型
  223. /// </summary>
  224. /// <param name="sourceValue">字节集</param>
  225. /// <param name="index">索引</param>
  226. /// <returns></returns>
  227. public static float getFloatFromByteSet(byte[] sourceValue, int index)
  228. {
  229. float result = 0f;
  230. GameUtil._CopyMemory_ByteSet_Float(ref result, ref sourceValue[index], );
  231. return result;
  232. }
  233.  
  234. /// <summary>
  235. /// 获取字节集
  236. /// </summary>
  237. /// <param name="data">需要转换到字节集的数据</param>
  238. /// <returns></returns>
  239. public static byte[] getByteSet(float data)
  240. {
  241. return Encoding.UTF8.GetBytes(data.ToString());
  242. }
  243.  
  244. //根据名称取进程PID 不得有后缀.exe
  245. //根据进程名获取PID 不得有后缀.exe
  246. public static int getPidByProcessName(string processName)
  247. {
  248. Process[] ArrayProcess = Process.GetProcessesByName(processName);
  249. foreach (Process pro in ArrayProcess)
  250. {
  251. return pro.Id;
  252. }
  253. return ;
  254. }
  255. //获取模块地址
  256. public static int getMoudleAddress(string processName ,string dllname )
  257. {
  258. foreach (Process p in Process.GetProcessesByName(processName))
  259. {
  260.  
  261. foreach (ProcessModule m in p.Modules)
  262. {
  263. if (m.ModuleName.Equals(dllname))
  264. return (int)m.BaseAddress;
  265. }
  266.  
  267. }
  268. return ;
  269. }
  270. //取窗口句柄 这里传入的值是窗口标题
  271. public static IntPtr getWindowsHandler_findwindow(String classname,String windowtitle)
  272. {
  273. IntPtr maindHwnd = FindWindow(classname, windowtitle); //获得QQ登陆框的句柄
  274.  
  275. return maindHwnd;
  276.  
  277. }
  278.  
  279. public static RECT getWindowsRect(IntPtr windowsHandler)
  280. {
  281. RECT rec = new RECT();
  282. GetWindowRect(windowsHandler, ref rec);//h为窗口句柄
  283.  
  284. return rec;
  285. }
  286.  
  287. }

窗口类c#

  1. public partial class Form1 : Form
  2. {
  3. int PID;
  4. int matrix;//矩阵基质
  5. float formwidth;//窗口宽度
  6. float formheight;//窗口高度
  7. int processmoudle;//进程模块;
  8. IntPtr windowshandle;//窗口句柄
  9. int dx11hwnd;//dx11创建的透明窗口句柄
  10. private void loop()//循环
  11. {
  12. while (true)
  13. {
  14. Util.DllHelper.OptimizeCUP();//防止占用cpu
  15. reflushWindows();
  16. startDrawit();
  17. Util.DllHelper.OptimizeDelayed();//防止占用cpu
  18. }
  19. }
  20. private void intData()
  21. {
  22. PID= Util.GameUtil.getPidByProcessName("cstrike");
  23. windowshandle=Util.GameUtil.getWindowsHandler_findwindow("Valve001", "Counter-Strike");
  24. processmoudle=Util.GameUtil.getMoudleAddress("cstrike", "cstrike.exe");
  25. matrix = processmoudle + ;
  26. formwidth= Util.GameUtil.getWindowsRect(windowshandle).Right - Util.GameUtil.getWindowsRect(windowshandle).Left;
  27. formheight= Util.GameUtil.getWindowsRect(windowshandle).Bottom - Util.GameUtil.getWindowsRect(windowshandle).Top;
  28. //this.ShowInTaskbar = false;//任务栏显示为假
  29. Debug.Print(PID + "PID" + "windowshandle" + windowshandle + "matrix" + matrix + "formwidth" + formwidth + "formheight" + formheight);
  30. }
  31. private void startIt()
  32. {
  33. Util.DllHelper.InitDX11();//初始化dx11
  34. dx11hwnd = Util.DllHelper.GetDX11CreateWindowHandle();//取得dx11创建的透明窗口的句柄
  35. if (dx11hwnd == ) MessageBox.Show("DX11加载失败"); else MessageBox.Show("DX11加载成功");
  36. reflushWindows();
  37. loop();
  38.  
  39. }
  40. private void startDrawit()
  41. {
  42. Util.DllHelper.StartDrawing();//开始绘图
  43. Util.DllHelper.DrawText(, , "C#dx11", Util.DllHelper.COLORYELLOW);
  44. worldtoScreen();
  45. Util.DllHelper.EndDrawing();//结束绘图
  46. }
  47. private void worldtoScreen()//游戏世界转屏幕
  48. {
  49. float arr00 = Util.GameUtil.ReadMemoryFloat(PID, matrix);
  50. float arr01 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  51. float arr02 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  52. float arr03 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  53. float arr10 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  54. float arr11 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  55. float arr12 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  56. float arr13 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  57. float arr20 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  58. float arr21 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  59. float arr22 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  60. float arr23 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  61. float arr30 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  62. float arr31 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  63. float arr32 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  64. float arr33 = Util.GameUtil.ReadMemoryFloat(PID, matrix + );
  65. //得到矩阵所有值
  66. float sightwidth = formwidth / ;//视角宽
  67. float sightheight = formheight / ;//视角高
  68.  
  69. float enemy_x = Util.GameUtil.ReadMemoryFloat(PID, processmoudle + - );
  70. float enemy_y = Util.GameUtil.ReadMemoryFloat(PID, processmoudle + - );
  71. float enemy_z = Util.GameUtil.ReadMemoryFloat(PID, processmoudle + );
  72. float camera_Z = arr02 * enemy_x + arr12 * enemy_y + arr22 * enemy_z + arr32;
  73. if (camera_Z <= 0.01) return;
  74.  
  75. float zoom = / camera_Z;//缩放比例
  76. float camera_x = sightwidth + (arr00 * enemy_x + arr10 * enemy_y + arr20 * enemy_z + arr30) * zoom * sightwidth;
  77. float camera_y = sightheight - (arr01 * enemy_x + arr11 * enemy_y + arr21 * (enemy_z + ) + arr31) * zoom * sightheight * ;
  78. float camera_y2 = sightheight - (arr01 * enemy_x + arr11 * enemy_y + arr21 * (enemy_z - ) + arr31) * zoom * sightheight * - ;
  79. float squareheight = camera_y2 - camera_y;//方框高度
  80. Util.DllHelper.DrawSquare((int)(camera_x - squareheight / ), (int)camera_y,(int) (squareheight / ), (int)squareheight, Util.DllHelper.COLORYELLOW, Util.DllHelper.COLORRED,);//绘制方框
  81. Util.DllHelper.OptimizeSystem();//系统处理事件防止cup过多
  82. Util.DllHelper.DrawLine((int)sightwidth,, (int)camera_x, (int)camera_y,,Util.DllHelper.COLORBLUE);//画直线
  83. }
  84. private void reflushWindows()//刷新窗口
  85. {
  86. Util.GameUtil.RECTClient rec = new Util.GameUtil.RECTClient() ;
  87. Util.GameUtil.LPPOINT point = new Util.GameUtil.LPPOINT();
  88.  
  89. Util.GameUtil.GetClientRect(windowshandle,out rec);
  90. Util.GameUtil.ClientToScreen(windowshandle, out point);
  91. formwidth = rec.Right-rec.Left;
  92. formheight = rec.Bottom-rec.Top ;
  93. Util.DllHelper.MoveWindows(dx11hwnd, point.x, point.y, (int)formwidth, (int)formheight);
  94. Util.DllHelper.SetWindowPos_Top(dx11hwnd);
  95. }
  96. public Form1()
  97. {
  98. InitializeComponent();
  99. }
  100.  
  101. private void button1_Click(object sender, EventArgs e)
  102. {
  103. startIt();
  104.  
  105. }
  106.  
  107. private void Form1_Load(object sender, EventArgs e)
  108. {
  109. intData();
  110. }
  111.  
  112. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  113. {
  114. // Util.DllHelper.SafetyQuit();
  115. Environment.Exit();
  116. }
  117. }

测试图(占用cpu极少)

下载链接 (不传git了)链接删了写的不好

C# 绘制矩形方框读写内存类 cs1.6人物透视例子的更多相关文章

  1. (转载)C#使用MemoryStream类读写内存

    MemoryStream和BufferedStream都派生自基类Stream,因此它们有很多共同的属性和方法,但是每一个类都有自己独特的用法.这两个类都是实现对内存进行数据读写的功能,而不是对持久性 ...

  2. C#使用MemoryStream类读写内存

    MemoryStream和BufferedStream都派生自基类Stream,因此它们有很多共同的属性和方法,但是每一个类都有自己独特的用法.这两个类都是实现对内存进行数据读写的功能,而不是对持久性 ...

  3. MemoryStream类读写内存

    和FileStream一样,MemoryStream和BufferedStream都派生自基类Stream,因此它们有很多共同的属性和方法,但是每一个类都有自己独特的用法.这两个类都是实现对内存进行数 ...

  4. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  5. Spring-Boot ☞ ShapeFile文件读写工具类+接口调用

    一.项目目录结构树 二.项目启动 三.往指定的shp文件里写内容 (1) json数据[Post] { "name":"test", "path&qu ...

  6. OpenGL学习——绘制矩形

    接下来稍微扩展一步,绘制矩形,即两个拼在一起的三角形. 引入一个概念, EBO Element Buffer Object  元素缓冲对象, EBO用于存放描述“顶点绘制顺序”的对象. 外注:创建VS ...

  7. opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像

    前言 好长时间没写博文了,今天偷偷懒写篇关于opencv2中鼠标响应操作的文章. 鼠标操作属于用户接口设计,以前一直使用Qt来做,但是如果只需要简单的鼠标,键盘操作,直接调用opencv库的函数也未尝 ...

  8. canvas 绘制 矩形 圆形

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <tit ...

  9. Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式

    Linux就这个范儿 第18章  这里也是鼓乐笙箫  Linux读写内存数据的三种方式 P703 Linux读写内存数据的三种方式 1.read  ,write方式会在用户空间和内核空间不断拷贝数据, ...

随机推荐

  1. 玩转NB-IOT模块之sim7000c

    https://blog.csdn.net/liwei16611/article/details/82698926 http://bbs.21ic.com/icview-2104630-1-1.htm ...

  2. Struts2学习(五)

    表达式 1.表达式语言 ( Expression Language )2.表达式的本质:  就是 按照某种规则 书写的 字符串3.表达式的处理: 一定有一套程序 对 表达式 中的 字符串进行解析和处理 ...

  3. 第1节 Scala基础语法:13、list集合的定义和操作;16、set集合;17、map集合

    list.+:5 , list.::5: 在list集合头部添加单个元素5 : li1.:+(5):在list集合尾部添加单个元素5: li1++li2,li1:::li2:在li1集合尾部添加il2 ...

  4. 常见Linux发行版有哪些?

    Linux 发行版(英语:Linux distribution,也被叫做GNU/Linux 发行版),为一般用户预先集成好的Linux操作系统及各种应用软件.一般用户不需要重新编译,在直接安装之后,只 ...

  5. 解题报告:luogu P1433 吃奶酪

    题目链接:P1433 吃奶酪 我感觉可以改成:[模板]TSP问题(商旅问题) 了. 爆搜\(T\)一个点,考虑状压\(dp\)(还是爆搜). 我们用\(dp[i][j]\)表示现在是\(i\)状态,站 ...

  6. RIFF

    RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构. RIFF文件所包含的数据类型由该文件的扩展 ...

  7. Spring Schedule 实现定时任务

    很多时候我们都需要为系统建立一个定时任务来帮我们做一些事情,SpringBoot 已经帮我们实现好了一个,我们只需要直接使用即可,当然你也可以不用 SpringBoot 自带的定时任务,整合 Quar ...

  8. 傅盛读书笔记:下一个Moonshot是什么?

    猎豹移动CEO 傅盛 九月底,我有幸在硅谷拜访了苹果前CEO斯卡利.老人如今已经75岁高龄,但看起来仍充满活力.他花了一上午的时间跟我们沟通,非常谦和.平等.坦诚,给我留下了很深的印象.末了,给我们介 ...

  9. CF1209C Paint the Digits

    CF1209C Paint the Digits 题意:给定T组数据,每组数据第一行输入数字串长度,第二行输入数字串,用数字1和2对数字串进行涂色,被1涂色的数字子串和被2涂色的数字子串拼接成新的数字 ...

  10. 带你了解后渗透工具Koadic

    前言: 在朋友的博客上看到推荐的一款工具Koadic,我接触了以后发现很不错这款工具的强大之处我觉得就是拿到shell后的各种模块功能,我就自己写出来发给大家看看吧. 首先把项目克隆到本地: 项目地址 ...