知识大全 “扫雷”游戏地幕后2

Posted

篇首语:获致幸福的不二法门是珍视你所拥有的、遗忘你所没有的。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 “扫雷”游戏地幕后2相关的知识,希望对你有一定的参考价值。

  IntPtr lpBaseAddress

  [In Out] byte[] buffer

  UInt size

  out IntPtr lpNumberOfBytesRead

  );

  [DllImport(\\ kernel dll\\ )] public static extern Int CloseHandle(

  IntPtr hObject

  );

  如果你想知道在c++和c#之间有关类型转换的更多信息 我建议你从站点搜索此话题 Marshaling Data with Platform Invoke 基本上 如果你把逻辑上是正确的程序搁在那儿 它便能运行 但有时还需要一点点的调整

  在声明了这些函数之后 我要做的是用一个简单的类把它们包装起来 并使用这个类 我把声明放在一个叫做ProcessMemoryReaderApi的类中 这样做更有条有理 主要的实用类称为ProcessMemoryReade 这个类有一个ReadProcess属性 它源于System Diagnostics Process类型 用于存放你要读取其内存的进程 类中有一个方法 用来以读模式打开进程

  public void OpenProcess()

  

  m_hProcess = ProcessMemoryReaderApi OpenProcess(

  ProcessMemoryReaderApi PROCESS_VM_READ

  (uint)m_ReadProcess Id);

  

  PROCESS_VM_READ 常量告诉系统以读模式打开进程 而m_ReadProcess Id 声明了我要打开的是什么进程

  在该类中最重要的是一个方法 它从进程中读取内存

  public byte[] ReadProcessMemory(IntPtr MemoryAddress uint bytesToRead

  out int bytesReaded)

  

  byte[] buffer = new byte[bytesToRead];

  IntPtr ptrBytesReaded;

  ProcessMemoryReaderApi ReadProcessMemory(m_hProcess MemoryAddress buffer

  bytesToRead out ptrBytesReaded);

  bytesReaded = ptrBytesReaded ToInt ();

  return buffer;

  

  这个函数以所请求的大小声明一个字节数组 并使用API读取内存 就这么简单!

  最后 下面这个方法关闭了进程

  public void CloseHandle()

  

  int iRetValue;

  iRetValue = ProcessMemoryReaderApi CloseHandle(m_hProcess);

  if (iRetValue == )

  throw new Exception(\\ CloseHandle failed\\ );

  

  第三步 – 使用类

  现在轮到了有趣的部分 使用这个类就是为了读取 扫雷 的内存并揭开布雷图 要使用类 需要先对其进行初始化

  ProcessMemoryReaderLib ProcessMemoryReader pReader

  = new ProcessMemoryReaderLib ProcessMemoryReader();

  接着 必须设置你想要读取其内存的进程 以下是如何获得 扫雷 进程的例子 这个进程一旦被装入 就被设置为ReadProcess属性

  System Diagnostics Process[] myProcesses    ;                 = System Diagnostics Process GetProcessesByName(\\ winmine\\ );

  pReader ReadProcess = myProcesses[ ];

  我们现在需要做的是 打开进程 读取内存 并在完成后关闭它 下面还是有关操作的例子 它读取代表布雷图宽度的地址

    pReader OpenProcess();

  int iWidth;

  byte[] memory;

  memory = pReader ReadProcessMemory((IntPtr) x out bytesReaded);

  iWidth = memory[ ];

  pReader CloseHandle();

  简单吧!

  在结论部分 我列出了显示布雷图的完整代码 别忘了 我要访问的所有内存位置就是在本文第一部分中所找到位置

  // 布雷图的资料管理器

  System Resources ResourceManager resources = new System Resources ResourceManager(typeof(Form ));

  ProcessMemoryReaderLib ProcessMemoryReader pReader

  = new ProcessMemoryReaderLib ProcessMemoryReader();

  System Diagnostics Process[] myProcesses

  = System Diagnostics Process GetProcessesByName(\\ winmine\\ );                   // 获得 扫雷 进程的第一个实列

  if (myProcesses Length == )

  

  MessageBox Show(\\ No MineSweeper process found!\\ );

  return;

  

  pReader ReadProcess = myProcesses[ ];

  // 以读内存模式打开进程

  pReader OpenProcess();

  int bytesReaded;

  int iWidth iHeight iMines;

  int iIsMine;

  int iCellAddress;

  byte[] memory;

  memory = pReader ReadProcessMemory((IntPtr) x out bytesReaded);

  iWidth = memory[ ];

  txtWidth Text = iWidth ToString();

  memory = pReader ReadProcessMemory((IntPtr) x out bytesReaded);

  iHeight = memory[ ];

  txtHeight Text = iHeight ToString();

  memory = pReader ReadProcessMemory((IntPtr) x out bytesReaded);

  iMines = memory[ ];

  txtMines Text = iMines ToString();

  // 删除以前的按钮数组

  this Controls Clear();

  this Controls AddRange(MainControls);

  // 创建一个按钮数组 用于画出布雷图的每一格

  ButtonArray = new System Windows Forms Button[iWidth iHeight];

  int x y;

  for (y= ; y<iHeight ; y++)

  for (x= ; x<iWidth ; x++)

  

  ButtonArray[x y] = new System Windows Forms Button();

  ButtonArray[x y] Location = new System Drawing Point( + x* + y* );

  ButtonArray[x y] Name = \\ \\ ;

  ButtonArray[x y] Size = new System Drawing Size( );

  iCellAddress = ( x ) + ( * (y+ )) + (x+ );

  memory = pReader ReadProcessMemory((IntPtr)iCellAddress out bytesReaded);

  iIsMine = memory[ ];

  if (iIsMine == x f)//如果有雷 则画出地雷位图

  ButtonArray[x y] Image = ((System Drawing Bitmap)

  (resources GetObject(\\ button Image\\ )));

  this Controls Add(ButtonArray[x y]);

  

  // 关闭进程句柄

  pReader CloseHandle();

cha138/Article/program/net/201311/12142

相关参考

知识大全 javascript 扫雷游戏示例

  <HTML><HEAD><TITLE>Javascript地雷</TITLE>  <style>inputno backgroundcolor:eeeeee; border:n

知识大全 恒大真正的幕后老板是谁

恒大真正的幕后老板是谁?是许家印。许家印才是真正的草根英雄,恒大地产的成功是许家印一步一个脚印走出来的,比起前段时间传的沸沸扬扬的巨力集团的公子哥杨子,许家印的成功更具借鉴性。他的成功更多地归功于他极

知识大全 Java实现扫雷(2)

Java实现扫雷(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  */  //清楚原来的方形

现代兵器知识 扫雷坦克

   装有扫雷器的坦克。用于在地雷场中为坦克开辟道路。扫雷器主要有机械扫雷器和爆破扫雷器两类。机械扫雷器又分滚压式、挖掘式和打击式三种。前两种开辟车辙式通路,每侧扫雷宽度

现代兵器知识 反水雷舰艇

   使用扫雷、猎雷、破雷设备搜索和排除水雷的舰艇。包括扫雷舰艇、猎雷舰和破雷舰。扫雷舰艇有:舰队扫雷艇、基地扫雷舰、港海扫雷舰、扫雷母舰等,主要用于在基地、港口附近及近

“幕后英雄”胰腺

对于体内的多数脏器,不管我们是否学医出身的,由于经常使用诸如肝胆相照、脑满肠肥、撕心裂肺、胃口不小、脾气大、肾气不足等词汇,或多或少知道些它们的功能或形态。惟有胰腺这个脏器,是大家不太熟悉的。这是由于

现代科学技术 扫雷机器人

   法国专门制造水下工作机器人的因泰絮德公司,1989年4月在塞纳滨海省介绍了它的第一个用于扫雷的陆地机器人。这个命名为机动操作平台250型的机器人,是一个远距离操纵的

知识大全 Java扫雷算法

Java扫雷算法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  建立一个雷区可以用一个一个的JB

知识大全 扫雷程序(Java语言)

扫雷程序(Java语言)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  importjavaaw

知识大全 自创C#扫雷代码

趣味编程:自创C#扫雷代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &