您的位置:首页 > 其它

[转]Marshal.GetDelegateForFunctionPointer

2008-09-09 15:30 337 查看
原来是为了在游戏外挂中发送键盘鼠标消息,自己写个sendmessage或者是postmessage又比较麻烦。于是google了一下,发现现在很多脚本工具都有这个功能,其中按键精灵的一个叫361度的插件已经有这个的实现,还验证过了。为什么不拿来己用呢?

首先分析一下按键精灵插件的接口,发现:

        public static void BGKM_Mouse(IntPtr hWnd, int code, int x, int y)

        {

            BGKM_ExecuteCommand(15, BuildParameters(hWnd, code, x, y), null);

        }

        public static WinApi.POINT BGKM_ScrToCli(IntPtr hWnd, int x, int y)

        {

            StringBuilder retVal = new StringBuilder();

            BGKM_ExecuteCommand(16, BuildParameters(hWnd, x, y), retVal);

            string[] tmp = retVal.ToString().Split('|');

            return new WinApi.POINT(int.Parse(tmp[0]), int.Parse(tmp[1]));

        }

    }

}

好了,方便哇?这样一来,我们可以在.net上面实现动态加载和卸载Win32 dll. 具体思路就是:(还是代码来得方便)

public delegate int MsgBox(int hwnd,string msg,string cpp,int ok);

[DllImport("Kernel32")]

public static extern int GetProcAddress(int handle, String funcname);

[DllImport("Kernel32")]

public static extern int LoadLibrary(String funcname);

[DllImport("Kernel32")]

public static extern int FreeLibrary(int handle);

private static Delegate GetAddress(int dllModule, string functionname, Type t)

{

 int addr = GetProcAddress(dllModule, functionname);

 if (addr == 0) 

  return null; 

 else 

  return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);

}

private void button1_Click(object sender, EventArgs e)

{

 int huser32 = 0;

 huser32 = LoadLibrary("user32.dll"); 

 MsgBox mymsg = (MsgBox)GetAddress(huser32, "MessageBoxA", typeof(MsgBox));

 mymsg(this.Handle.ToInt32(), txtmsg.Text, txttitle.Text , 64);

 FreeLibrary(huser32);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: