关于句柄
初识句柄
关于句柄,第一次听说的时候是大学的时候,当时玩一款游戏叫做“造梦西游”,当时刷副本基本上就是重复工作,所以那时候开始用外挂,开始使用外挂来进行这种重复性的工作,当时写的全是脚本文件,甚至对当时打完以后回不到回城点这一bug修复了好久,当时用到的最重要的知识点就是句柄。当时的我理解的意思是可以获取窗体上任意位置和任意按钮,然后可以对这些位置和按钮进行操作和定义,就仿佛有个机器人精准识别这些东西替你打游戏一样。
句柄(Handle)
听说最开始的开发书籍中,将Handle翻译为“把手”,你握住的是把手,却能拉动整个门,而且不用去在意门长什么样,如果一个门有多个把手,被不同的人(进程)握住,门往哪儿开就不好说了。
句柄就是个数字,属于HWND类型(这类型和char int等同级),它是一个对象的唯一标识,和对象一一对应。它可以是一个块内存,一个资源或者一个服务的context(如socket、thread)等等。它的来源可以有很多种,只要能保证和它所代表的对象保持唯一对应就可以,比如说可以用内存地址,也可以用句柄表的信号,或者干脆用一个自增ID,再或者用以上的值去异或一个常数。
句柄的作用
句柄的作用就是再C语言环境下代替C++的对象指针来用的。创建句柄就是构造,销毁句柄就是析构,用句柄调用函数相当于传入this指针。
示例
using System.Runtime.InteropServices; [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); private void btn_Click(object sender,EventArgs e) { IntPtr mainHandle=FindWindow(null,"Form"); if(mainHandle!=IntPtr.Zero) { bool result=ShowWindowAsync(mainHandle,3); } }