﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-叶子的家</title><link>http://www.cnblogs.com/wj/</link><description>~●~●~●~●~●~●○离成功还很远，距离长着叻，Fighting！</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 09:30:23 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 09:30:23 GMT</pubDate><ttl>60</ttl><item><title>台服信长之野望全后台辅助外挂</title><link>http://www.cnblogs.com/wj/archive/2009/07/22/1528335.html</link><dc:creator>绿叶</dc:creator><author>绿叶</author><pubDate>Wed, 22 Jul 2009 01:49:00 GMT</pubDate><guid>http://www.cnblogs.com/wj/archive/2009/07/22/1528335.html</guid><description><![CDATA[<p>阅读: 588 评论: 9 作者: <a href="http://www.cnblogs.com/wj/" target="_blank">绿叶</a> 发表于 2009-07-22 09:49 <a href="http://www.cnblogs.com/wj/archive/2009/07/22/1528335.html" target="_blank">原文链接</a></p><div>最近有平时有玩信长之野望，在台服。此游戏战斗模式比较特殊，而且内容相当的丰富，很是吸引我。<br />玩了一段时间后，这辅助外挂在我手下就诞生了，发图纪念：<br /><br /><img height="399" alt="" src="http://users.tpg.com.au/wjshome/1.JPG" width="535" border="0" /><br /><br />简介：<br />外挂主要处理战斗中的技能、战斗结束窗口的自动点击，是半自动的外挂。多适合攻手使用，对非攻手职业也可，可能作用不大。<br />特点：<br />1. 带有命令队列，可以自定义一系列战斗命令，命令按顺序发送。比如可以定义一个3条命令的列表，开始战斗后，就按照次列表依次发送 1-2-3 这样。<br />2. 带有优先队列，可以自定义攻击怪物的优先等级，同名字的怪物也可以定义先攻击哪个位置怪物。比如在刷动物园的时候，就非常有用啦。<br />3. 技能点击"0"延迟，以极快的速度发送命令，100ms内完成。<br />应用：<br />我本人多数应用在动物园（佐12，鹿12）中，组队，跟随，开启外挂，最小化，做其他事情比如看电影，就等打完手工回报就好。<br />发展：<br />目前外挂只适用于台服信长，国服我没玩，因为在海外，所以没测试。不过国服应该是用不了，很多内存地址是不同的，因为版本不同嘛。以后有时间会考虑开发国服版。<br />像一个这样的辅助外挂，技术实现上面的难度不会太大。时间费在反汇编上面，还有界面的同步处理上面。外挂还没有发布，如果发布，￥10/月，我想大家也可以接受哇？再想想看吧，如果是免费的话，我想我会弄点广告上去。不过看来多数都不值得搞的啦。有需要的可以发mail和我谈谈。<br />&nbsp;<img src="http://www.cnblogs.com/Emoticons/xd/016.gif"  alt="" /></div><img src="http://www.cnblogs.com/wj/aggbug/1528335.html?type=1" width="1" height="1" alt=""/><p>评论: 9　<a href="http://www.cnblogs.com/wj/archive/2009/07/22/1528335.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wj/archive/2009/07/22/1528335.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56859/" target="_blank">美调查公司称苹果iPad配件成本最低219美元</a><span style="color:gray">(2010-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/56858/" target="_blank">摩尔庄园：儿童生意密码</a><span style="color:gray">(2010-02-10 17:15)</span><br/>· <a href="http://news.cnblogs.com/n/56857/" target="_blank">Facebook与美国在线合作 整合AIM动态功能</a><span style="color:gray">(2010-02-10 16:41)</span><br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>SEO Elite ver 4.0 R93 Patcher</title><link>http://www.cnblogs.com/wj/archive/2009/02/12/1388751.html</link><dc:creator>绿叶</dc:creator><author>绿叶</author><pubDate>Thu, 12 Feb 2009 00:09:00 GMT</pubDate><guid>http://www.cnblogs.com/wj/archive/2009/02/12/1388751.html</guid><description><![CDATA[<p>阅读: 763 评论: 1 作者: <a href="http://www.cnblogs.com/wj/" target="_blank">绿叶</a> 发表于 2009-02-12 08:09 <a href="http://www.cnblogs.com/wj/archive/2009/02/12/1388751.html" target="_blank">原文链接</a></p><p>This is my&nbsp;yesterday's cracking work for the last version of SEO Elite(v4 r93). </p>
<p>
<hr />
</p>
<p>original download:</p>
<p><a href="http://www.seoelite.com/SEOE_setup4093.exe">http://www.seoelite.com/SEOE_setup4093.exe</a></p>
<p>patcher download:</p>
<p><a href="http://files.cnblogs.com/wj/seo.elite-patch.rar">http://files.cnblogs.com/wj/seo.elite-patch.rar</a></p>
<p>
<hr />
</p>
<p>Cracking only for fun and learning. If you don't want to see this artical, email me.</p>
<img src="http://www.cnblogs.com/wj/aggbug/1388751.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/wj/archive/2009/02/12/1388751.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wj/archive/2009/02/12/1388751.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56859/" target="_blank">美调查公司称苹果iPad配件成本最低219美元</a><span style="color:gray">(2010-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/56858/" target="_blank">摩尔庄园：儿童生意密码</a><span style="color:gray">(2010-02-10 17:15)</span><br/>· <a href="http://news.cnblogs.com/n/56857/" target="_blank">Facebook与美国在线合作 整合AIM动态功能</a><span style="color:gray">(2010-02-10 16:41)</span><br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Remove 5 seconds constraint in Garena(GGC)</title><link>http://www.cnblogs.com/wj/archive/2008/09/09/Garena_GGC.html</link><dc:creator>绿叶</dc:creator><author>绿叶</author><pubDate>Tue, 09 Sep 2008 10:34:00 GMT</pubDate><guid>http://www.cnblogs.com/wj/archive/2008/09/09/Garena_GGC.html</guid><description><![CDATA[<p>阅读: 1359 评论: 20 作者: <a href="http://www.cnblogs.com/wj/" target="_blank">绿叶</a> 发表于 2008-09-09 18:34 <a href="http://www.cnblogs.com/wj/archive/2008/09/09/Garena_GGC.html" target="_blank">原文链接</a></p><p><font face="Verdana">Using UE to&nbsp;modify the red line command to "<span style="color: red">JMP</span>" is ok.</font></p>
<p>If you don't know how to modify, just leave me a message.</p>
<p>&nbsp;</p>
<p>A modified version download (<span style="color: #ff0000">decompress and copy it to your Garena folder</span>):</p>
<p>06.03.2009: <a href="http://www.savefile.com/files/2028529">http://www.savefile.com/files/2028529</a></p>
<p><strike>14.11.2008: </strike><a href="http://www.savefile.com/files/1886103"><strike>http://www.savefile.com/files/1886103</strike></a></p>
<p><strike>02.11.2008: </strike><a href="http://www.savefile.com/files/1868223"><strike>http://www.savefile.com/files/1868223</strike></a></p>
<p><strike>10.10.2008: </strike><a href="http://www.savefile.com/files/1831336"><strike>http://www.savefile.com/files/1831336</strike></a></p>
<p><strike>07.10.2008: </strike><a href="http://www.savefile.com/files/1825822"><strike>http://www.savefile.com/files/1825822</strike></a></p>
<p><strike>20.09.2008: </strike><a href="http://www.savefile.com/files/1796291"><strike>http://www.savefile.com/files/1796291</strike></a></p>
<p><strike>09.09.2008: <font face="Verdana"><a href="http://www.savefile.com/files/1777343">http://www.savefile.com/files/1777343</a></font></strike></p>
<p>&nbsp;</p>
<p><font face="Verdana">004C5440&nbsp;&nbsp; $&nbsp; 6A FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH -1<br />
004C5442&nbsp;&nbsp; .&nbsp; 68 73A05800&nbsp;&nbsp; PUSH Garena.0058A073<br />
004C5447&nbsp;&nbsp; .&nbsp; 64:A1 0000000&gt;MOV EAX,DWORD PTR FS:[0]<br />
004C544D&nbsp;&nbsp; .&nbsp; 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EAX<br />
004C544E&nbsp;&nbsp; .&nbsp; 81EC E0000000 SUB ESP,0E0<br />
004C5454&nbsp;&nbsp; .&nbsp; 53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EBX<br />
004C5455&nbsp;&nbsp; .&nbsp; 55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EBP<br />
004C5456&nbsp;&nbsp; .&nbsp; 56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH ESI<br />
004C5457&nbsp;&nbsp; .&nbsp; 57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EDI<br />
004C5458&nbsp;&nbsp; .&nbsp; A1 E4F35F00&nbsp;&nbsp; MOV EAX,DWORD PTR DS:[5FF3E4]<br />
004C545D&nbsp;&nbsp; .&nbsp; 33C4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XOR EAX,ESP<br />
004C545F&nbsp;&nbsp; .&nbsp; 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EAX<br />
004C5460&nbsp;&nbsp; .&nbsp; 8D8424 F40000&gt;LEA EAX,DWORD PTR SS:[ESP+F4]<br />
004C5467&nbsp;&nbsp; .&nbsp; 64:A3 0000000&gt;MOV DWORD PTR FS:[0],EAX<br />
004C546D&nbsp;&nbsp; .&nbsp; 894C24 48&nbsp;&nbsp;&nbsp;&nbsp; MOV DWORD PTR SS:[ESP+48],ECX<br />
004C5471&nbsp;&nbsp; .&nbsp; 8B35 74935900 MOV ESI,DWORD PTR DS:[&lt;&amp;KERNEL32.GetTick&gt;;&nbsp; kernel32.GetTickCount<br />
004C5477&nbsp;&nbsp; .&nbsp; FFD6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CALL ESI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; [GetTickCount<br />
004C5479&nbsp;&nbsp; .&nbsp; 2B05 FC206000 SUB EAX,DWORD PTR DS:[6020FC]<br />
004C547F&nbsp;&nbsp; .&nbsp; 3D 88130000&nbsp;&nbsp; CMP EAX,1388<br />
<span style="color: red">004C5484&nbsp;&nbsp; .&nbsp; 0F83 AF000000 JNB Garena.004C5539&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp; 修改5S跳转</span><br />
004C548A&nbsp;&nbsp; .&nbsp; 68 AE010000&nbsp;&nbsp; PUSH 1AE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; /Arg2 = 000001AE<br />
004C548F&nbsp;&nbsp; .&nbsp; 8D4424 54&nbsp;&nbsp;&nbsp;&nbsp; LEA EAX,DWORD PTR SS:[ESP+54]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |<br />
004C5493&nbsp;&nbsp; .&nbsp; 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |Arg1<br />
004C5494&nbsp;&nbsp; .&nbsp; B9 582C6000&nbsp;&nbsp; MOV ECX,Garena.00602C58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |<br />
004C5499&nbsp;&nbsp; .&nbsp; E8 52E20300&nbsp;&nbsp; CALL Garena.005036F0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; \Garena.005036F0<br />
004C549E&nbsp;&nbsp; .&nbsp; 33FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XOR EDI,EDI<br />
004C54A0&nbsp;&nbsp; .&nbsp; BD 08000000&nbsp;&nbsp; MOV EBP,8<br />
004C54A5&nbsp;&nbsp; .&nbsp; 3968 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMP DWORD PTR DS:[EAX+18],EBP<br />
004C54A8&nbsp;&nbsp; .&nbsp; 89BC24 FC0000&gt;MOV DWORD PTR SS:[ESP+FC],EDI<br />
004C54AF&nbsp;&nbsp; .&nbsp; 72 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JB SHORT Garena.004C54B6<br />
004C54B1&nbsp;&nbsp; .&nbsp; 8B50 04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV EDX,DWORD PTR DS:[EAX+4]<br />
004C54B4&nbsp;&nbsp; .&nbsp; EB 03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMP SHORT Garena.004C54B9<br />
004C54B6&nbsp;&nbsp; &gt;&nbsp; 8D50 04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LEA EDX,DWORD PTR DS:[EAX+4]<br />
004C54B9&nbsp;&nbsp; &gt;&nbsp; BB 07000000&nbsp;&nbsp; MOV EBX,7<br />
004C54BE&nbsp;&nbsp; .&nbsp; 8BC2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV EAX,EDX<br />
004C54C0&nbsp;&nbsp; .&nbsp; 895C24 44&nbsp;&nbsp;&nbsp;&nbsp; MOV DWORD PTR SS:[ESP+44],EBX<br />
004C54C4&nbsp;&nbsp; .&nbsp; 897C24 40&nbsp;&nbsp;&nbsp;&nbsp; MOV DWORD PTR SS:[ESP+40],EDI<br />
004C54C8&nbsp;&nbsp; .&nbsp; 66:897C24 30&nbsp; MOV WORD PTR SS:[ESP+30],DI<br />
004C54CD&nbsp;&nbsp; .&nbsp; 8D70 02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LEA ESI,DWORD PTR DS:[EAX+2]<br />
004C54D0&nbsp;&nbsp; &gt;&nbsp; 66:8B08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV CX,WORD PTR DS:[EAX]<br />
004C54D3&nbsp;&nbsp; .&nbsp; 83C0 02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADD EAX,2<br />
004C54D6&nbsp;&nbsp; .&nbsp; 66:3BCF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMP CX,DI<br />
004C54D9&nbsp;&nbsp; .^ 75 F5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JNZ SHORT Garena.004C54D0<br />
004C54DB&nbsp;&nbsp; .&nbsp; 2BC6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUB EAX,ESI<br />
004C54DD&nbsp;&nbsp; .&nbsp; D1F8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAR EAX,1<br />
004C54DF&nbsp;&nbsp; .&nbsp; 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EAX<br />
004C54E0&nbsp;&nbsp; .&nbsp; 52&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EDX<br />
004C54E1&nbsp;&nbsp; .&nbsp; 8D4C24 34&nbsp;&nbsp;&nbsp;&nbsp; LEA ECX,DWORD PTR SS:[ESP+34]<br />
004C54E5&nbsp;&nbsp; .&nbsp; E8 F60AF4FF&nbsp;&nbsp; CALL Garena.00405FE0</font></p>
<img src="http://www.cnblogs.com/wj/aggbug/1287862.html?type=1" width="1" height="1" alt=""/><p>评论: 20　<a href="http://www.cnblogs.com/wj/archive/2008/09/09/Garena_GGC.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wj/archive/2008/09/09/Garena_GGC.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56859/" target="_blank">美调查公司称苹果iPad配件成本最低219美元</a><span style="color:gray">(2010-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/56858/" target="_blank">摩尔庄园：儿童生意密码</a><span style="color:gray">(2010-02-10 17:15)</span><br/>· <a href="http://news.cnblogs.com/n/56857/" target="_blank">Facebook与美国在线合作 整合AIM动态功能</a><span style="color:gray">(2010-02-10 16:41)</span><br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Robot development framework in Mush Client (Lua)</title><link>http://www.cnblogs.com/wj/archive/2008/07/12/1241569.html</link><dc:creator>绿叶</dc:creator><author>绿叶</author><pubDate>Sat, 12 Jul 2008 11:40:00 GMT</pubDate><guid>http://www.cnblogs.com/wj/archive/2008/07/12/1241569.html</guid><description><![CDATA[<p>阅读: 733 评论: 5 作者: <a href="http://www.cnblogs.com/wj/" target="_blank">绿叶</a> 发表于 2008-07-12 19:40 <a href="http://www.cnblogs.com/wj/archive/2008/07/12/1241569.html" target="_blank">原文链接</a></p><p>Play mud games? Using Mush Client to write robot? Let's see what I show you~<br />
<br />
This is&nbsp;a framework I wrote for writing robot with Lua Script in Mush Client.<br />
The framework enables you dealing with every action/command base on the message/event type, and do it in sequence, which means you needn't pay attention to enable or disable a trigger, and just focuing on the logical of your robot.<br />
The idea of the framework is liking a Windows Message/Event D<font face="Verdana">riven mode. A serial of events you can define, and handle them in a callback function. The key point is an event can be defined as triggered how many times within a period or <font face="Verdana">infinite</font> time.<br />
Moreover, a command sender I created helps you send commands for <font face="Verdana">repetition, delaying, or you can extend it to process some special commands by adding codes in Command:Send function. The command sender will ensure all of your commands sent <font face="Verdana">in sequence according to the order you invoke the Command:Add function.<br />
</font></font></font></p>
<p>In order to use this framework to develop your robot, you can follow this way:<br />
1. define an event you wanna handle.<br />
2. create a trigger in mush to fire this event.<br />
3. write a call back function for this event.<br />
4. in the callback function, you are able to do some response by sending commands using command sender.</p>
<p>for example:<br />
<strong>you can create a trigger like:<br />
</strong><img height="203" alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/Mush_Client/mush.jpg" width="643" border="0" /><br />
<br />
<br />
<strong>you can handle events like:</strong></p>
<div class="cnblogs_code"><span style="color: #008000">--</span><span style="color: #008000">&nbsp;handle&nbsp;"event1"</span><span style="color: #008000"><br />
</span><span style="color: #000000">Listener.new():Register(Event.new(</span><span style="color: #800000">"</span><span style="color: #800000">event1</span><span style="color: #800000">"</span><span style="color: #000000">),&nbsp;EventHandler1.new())<br />
EventHander1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;class(Callback)<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;EventHander1:Do(event,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;do&nbsp;something</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cmdSender:Add(</span><span style="color: #800000">"</span><span style="color: #800000">cmd1;#3&nbsp;cmd2;@2;cmd3</span><span style="color: #800000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;#3&nbsp;means&nbsp;repeat&nbsp;3&nbsp;times,&nbsp;@2&nbsp;means&nbsp;delay&nbsp;2&nbsp;seconds</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;handle&nbsp;"event2"&nbsp;five&nbsp;times</span><span style="color: #008000"><br />
</span><span style="color: #000000">Listener.new():Register(Event.new(</span><span style="color: #800000">"</span><span style="color: #800000">event2,&nbsp;0,&nbsp;5</span><span style="color: #800000">"</span><span style="color: #000000">),&nbsp;EventHandler2.new())<br />
EventHander2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;class(Callback)<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;EventHander2:Do(event,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;do&nbsp;something</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cmdSender:Add({</span><span style="color: #800000">"</span><span style="color: #800000">cmd4</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">@3</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">#2&nbsp;cmd5</span><span style="color: #800000">"</span><span style="color: #000000">})&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;accept&nbsp;commands&nbsp;in&nbsp;a&nbsp;table</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;handle&nbsp;"event3"&nbsp;twice&nbsp;within&nbsp;10&nbsp;seconds.&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;triggered&nbsp;twice&nbsp;within&nbsp;10&nbsp;seconds,&nbsp;a&nbsp;timeout&nbsp;event&nbsp;is&nbsp;sent.</span><span style="color: #008000"><br />
</span><span style="color: #000000">Listener.new():Register(Event.new(</span><span style="color: #800000">"</span><span style="color: #800000">event3,&nbsp;10,&nbsp;2</span><span style="color: #800000">"</span><span style="color: #000000">),&nbsp;EventHandler3.new())<br />
EventHander3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;class(Callback)<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;EventHander3:Do(event,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;do&nbsp;something</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(event.isTimeout)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdSender:Add(</span><span style="color: #800000">"</span><span style="color: #800000">cmd6</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdSender:Add({</span><span style="color: #800000">"</span><span style="color: #800000">cmd7</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">cmd8</span><span style="color: #800000">"</span><span style="color: #000000">})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span></div>
<p><br />
<strong>Here is the codes of this framework, copy it to your lua&nbsp;script file, then you can use it.</strong></p>
<div class="cnblogs_code"><span style="color: #008000">--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
--</span><span style="color: #008000">&nbsp;OO,&nbsp;implement&nbsp;class&nbsp;module</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;</span><span style="color: #008080">_class</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{}<br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;class(super)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;class_type&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;class_type.ctor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;class_type.super&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;super<br />
&nbsp;&nbsp;&nbsp;&nbsp;class_type.new&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">(<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;create<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">(c,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;c.super&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create(c.super,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;c.ctor&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.ctor(obj,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create(class_type,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">setmetatable</span><span style="color: #000000">(obj,&nbsp;{&nbsp;__index&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #008080">_class</span><span style="color: #000000">[class_type]&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;obj<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;vtbl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">_class</span><span style="color: #000000">[class_type]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;vtbl<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">setmetatable</span><span style="color: #000000">(class_type,&nbsp;{&nbsp;__newindex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">(t,&nbsp;k,&nbsp;v)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtbl[k]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;v<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;})<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;super&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">setmetatable</span><span style="color: #000000">(vtbl,&nbsp;{&nbsp;__index&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">(t,k)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #008080">_class</span><span style="color: #000000">[super][k]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtbl[k]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ret<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ret<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;class_type<br />
</span><span style="color: #0000ff">end</span></div>
<br />
<br />
<div class="cnblogs_code"><span style="color: #008000">--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
--</span><span style="color: #008000">&nbsp;event</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-&nbsp;type:&nbsp;type&nbsp;of&nbsp;an&nbsp;event</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-&nbsp;timeout:&nbsp;in&nbsp;a&nbsp;particular&nbsp;time(in&nbsp;seconds)&nbsp;didn't&nbsp;receive&nbsp;the&nbsp;event&nbsp;will&nbsp;fire&nbsp;a&nbsp;timeout&nbsp;event</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-&nbsp;times:&nbsp;the&nbsp;event&nbsp;will&nbsp;be&nbsp;triggered&nbsp;how&nbsp;many&nbsp;times,&nbsp;then&nbsp;will&nbsp;be&nbsp;self&nbsp;removed</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
Event&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;class()<br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Event:ctor(</span><span style="color: #ff00ff">type</span><span style="color: #000000">,&nbsp;timeout,&nbsp;times)<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.</span><span style="color: #ff00ff">type</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">type</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(timeout&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">and</span><span style="color: #000000">&nbsp;times&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;if&nbsp;both&nbsp;timeout&nbsp;and&nbsp;times&nbsp;are&nbsp;not&nbsp;set,&nbsp;then&nbsp;can&nbsp;be&nbsp;triggered&nbsp;any&nbsp;times&nbsp;(set&nbsp;times&nbsp;to&nbsp;zero)</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.timeout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.times&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">elseif</span><span style="color: #000000">&nbsp;(timeout&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">and</span><span style="color: #000000">&nbsp;times&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;if&nbsp;timeout&nbsp;is&nbsp;set,&nbsp;times&nbsp;is&nbsp;not&nbsp;set,&nbsp;then&nbsp;can&nbsp;be&nbsp;trigger&nbsp;only&nbsp;once</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.timeout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;timeout<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.times&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;if&nbsp;both&nbsp;timeout&nbsp;and&nbsp;times&nbsp;are&nbsp;set,&nbsp;then&nbsp;can&nbsp;be&nbsp;trigger&nbsp;any&nbsp;times&nbsp;within&nbsp;timeout</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.timeout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;timeout<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.times&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;times<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;self.isTimeout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;self.triggered&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Event:Reset()<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.isTimeout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;self.triggered&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span></div>
<br />
<div class="cnblogs_code"><span style="color: #008000">--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
--</span><span style="color: #008000">&nbsp;callback:&nbsp;callback&nbsp;function&nbsp;when&nbsp;receved&nbsp;an&nbsp;event</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
Callback&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;class()<br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Callback:ctor(insideFunc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.func&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;insideFunc<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Callback:Invoke(event,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;logging</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;helper:Print(</span><span style="color: #800000">"</span><span style="color: #800000">Event:</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;event.</span><span style="color: #ff00ff">type</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">&nbsp;Timeout:</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;event.isTimeout,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">&nbsp;Triggered:</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;event.triggered)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;call&nbsp;handler</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;self:Do(event,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Callback:Do(event,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;helper:Print(</span><span style="color: #800000">"</span><span style="color: #800000">Do&nbsp;Noting</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">end</span></div>
<br />
<div class="cnblogs_code"><span style="color: #008000">--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
--</span><span style="color: #008000">&nbsp;listener</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
Listener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;class()<br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Listener:ctor()<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CreateGUID()<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Listener:Register(event,&nbsp;callback)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">assert</span><span style="color: #000000">(event.</span><span style="color: #ff00ff">type</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">event&nbsp;type&nbsp;is&nbsp;nil</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.event&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;event<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.callback&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;callback<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;create&nbsp;timer&nbsp;if&nbsp;has&nbsp;timeout</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(event.timeout&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;create&nbsp;timer&nbsp;using&nbsp;type&nbsp;as&nbsp;timer&nbsp;name</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helper:AddTimer(self.event.</span><span style="color: #ff00ff">type</span><span style="color: #000000">,&nbsp;self.event.timeout)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;add&nbsp;self&nbsp;in&nbsp;listener&nbsp;list</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;dispatcher:AddListener(self)<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Listener:Remove()<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">assert</span><span style="color: #000000">(self.event&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">have&nbsp;to&nbsp;register&nbsp;event&nbsp;then&nbsp;remove&nbsp;it</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;if&nbsp;has&nbsp;timer&nbsp;and&nbsp;the&nbsp;timer&nbsp;is&nbsp;not&nbsp;timeout,&nbsp;delete&nbsp;it</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(self.event.timeout&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">and</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">not</span><span style="color: #000000">&nbsp;self.event.isTimeout)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helper:RemoveTimer(self.event.</span><span style="color: #ff00ff">type</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;remove&nbsp;self&nbsp;in&nbsp;listener&nbsp;list</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;dispatcher:RemoveListener(self)<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Listener:OnEvent(<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;add&nbsp;triggered&nbsp;times</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;self.event.triggered&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;self.event.triggered&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;check&nbsp;if&nbsp;reach&nbsp;triggered&nbsp;times</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(self.event.times&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">and</span><span style="color: #000000">&nbsp;self.event.triggered&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;self.event.times)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self:Remove()<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;call&nbsp;back</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;self.callback:Invoke(self.event,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Listener:OnTimeout()<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;set&nbsp;isTimeout&nbsp;and&nbsp;call&nbsp;back</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;self.event.isTimeout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;delete&nbsp;listener</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;self:Remove()<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;call&nbsp;back</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;self.callback:Invoke(self.event)<br />
</span><span style="color: #0000ff">end</span></div>
<br />
<div class="cnblogs_code"><span style="color: #008000">--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
--</span><span style="color: #008000">&nbsp;event&nbsp;dispatcher</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
EventDispatcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;class()<br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;EventDispatcher:ctor()<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.listeners&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{}<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;EventDispatcher:AddListener(listener)<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.listeners[listener.id]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;listener<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;EventDispatcher:RemoveListener(listener)<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.listeners[listener.id]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;EventDispatcher:IsListening(listener)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(self.listeners[listener.id]&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;EventDispatcher:Match(eventType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;matchs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;k,&nbsp;v&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">pairs</span><span style="color: #000000">&nbsp;(self.listeners)&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(v.event.</span><span style="color: #ff00ff">type</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;eventType)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">table.insert</span><span style="color: #000000">(matchs,&nbsp;v)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;matchs<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;EventDispatcher:SendEvent(eventType,&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;matchs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;self:Match(eventType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">#</span><span style="color: #000000">matchs&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;k,&nbsp;v&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">pairs</span><span style="color: #000000">&nbsp;(matchs)&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v:OnEvent(<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;EventDispatcher:SendTimeout(timerName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;matchs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;self:Match(timerName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">#</span><span style="color: #000000">matchs&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;k,&nbsp;v&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">pairs</span><span style="color: #000000">&nbsp;(matchs)&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v:OnTimeout()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;only&nbsp;one&nbsp;instance</span><span style="color: #008000"><br />
</span><span style="color: #000000">dispatcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EventDispatcher.new()</span></div>
<br />
<div class="cnblogs_code"><span style="color: #008000">--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
--</span><span style="color: #008000">&nbsp;Helper</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
Helper&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;class()<br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Helper:ctor()<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.isPrint&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;self.cmds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{}<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Helper:Print(<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;self.isPrint&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Note(<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Helper:AddTimer(name,&nbsp;interval)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;hours&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">math.floor</span><span style="color: #000000">(interval&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">3600</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;interval&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;interval&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;(hours&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">3600</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;minutes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">math.floor</span><span style="color: #000000">(interval&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">60</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;seconds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;interval&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;(minutes&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">60</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;status&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;AddTimer&nbsp;(name,&nbsp;hours,&nbsp;minutes,&nbsp;seconds,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">dispatcher:SendTimeout(\</span><span style="color: #800000">""</span><span style="color: #800000">&nbsp;..&nbsp;name&nbsp;..&nbsp;</span><span style="color: #800000">"</span><span style="color: #000000">\</span><span style="color: #800000">"</span><span style="color: #800000">)</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;timer_flag.OneShot&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;timer_flag.Temporary&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;timer_flag.Replace,&nbsp;</span><span style="color: #800000">""</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">assert</span><span style="color: #000000">(status&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;error_code.eOK,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">fail&nbsp;to&nbsp;create&nbsp;timer:</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;..&nbsp;name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetTimerOption(name,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">send_to</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">12</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;EnableTimer(name,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;ResetTimer(name)<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Helper:ResetTimer(name,&nbsp;interval)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">assert</span><span style="color: #000000">(IsTimer(name),&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">timer&nbsp;doesn't&nbsp;exist</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;EnableTimer(name,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;hours&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">math.floor</span><span style="color: #000000">(interval&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">3600</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;interval&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;interval&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;(hours&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">3600</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;minutes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">math.floor</span><span style="color: #000000">(interval&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">60</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;seconds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;interval&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;(minutes&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">60</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetTimerOption(name,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">hour</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;hours)<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetTimerOption(name,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">minute</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;minutes)<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetTimerOption(name,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">second</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;seconds)<br />
&nbsp;&nbsp;&nbsp;&nbsp;EnableTimer(name,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;ResetTimer(name)<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Helper:RemoveTimer(name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;EnableTimer(name,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;DeleteTimer(name)<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;only&nbsp;one&nbsp;instance</span><span style="color: #008000"><br />
</span><span style="color: #000000">helper&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Helper.new()</span></div>
<br />
<div class="cnblogs_code"><span style="color: #008000">--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
--</span><span style="color: #008000">&nbsp;Command</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-&nbsp;Repeat:&nbsp;#4&nbsp;xx&nbsp;(repeat&nbsp;4&nbsp;times&nbsp;for&nbsp;command&nbsp;xx)</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-&nbsp;Delay:&nbsp;@3&nbsp;(delay&nbsp;3&nbsp;seconds)</span><span style="color: #008000"><br />
--</span><span style="color: #008000">-------------------------------------------------------</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
Command&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;class()<br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Command:ctor()<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.cmds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.isRunning&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;self.thread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Command:ToTable(cmds)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">assert</span><span style="color: #000000">(</span><span style="color: #ff00ff">type</span><span style="color: #000000">(cmds)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">string</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">commands&nbsp;must&nbsp;be&nbsp;string&nbsp;type</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;retVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;k,&nbsp;v&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">pairs</span><span style="color: #000000">(utils.split(cmds,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">;</span><span style="color: #800000">"</span><span style="color: #000000">))&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #ff00ff">string.sub</span><span style="color: #000000">(v,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">#</span><span style="color: #800000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;convert&nbsp;repeat&nbsp;command</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;sb,&nbsp;se&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">string.find</span><span style="color: #000000">(v,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">%s+</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">assert</span><span style="color: #000000">(sb&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">and</span><span style="color: #000000">&nbsp;se&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">wrong&nbsp;repeat&nbsp;command&nbsp;format</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;times&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">tonumber</span><span style="color: #000000">(</span><span style="color: #ff00ff">string.sub</span><span style="color: #000000">(v,&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">,&nbsp;sb&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;cmd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">string.sub</span><span style="color: #000000">(v,&nbsp;se&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;times,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retVal[</span><span style="color: #000000">#</span><span style="color: #000000">retVal&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cmd<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retVal[</span><span style="color: #000000">#</span><span style="color: #000000">retVal&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;v<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;retVal<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Command:Add(cmds)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #ff00ff">type</span><span style="color: #000000">(cmds)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">string</span><span style="color: #800000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;self:ToTable(cmds)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">assert</span><span style="color: #000000">(</span><span style="color: #ff00ff">type</span><span style="color: #000000">(cmds)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">table</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">commands&nbsp;must&nbsp;be&nbsp;string&nbsp;or&nbsp;table&nbsp;type</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;add&nbsp;cmds</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;k,&nbsp;v&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">pairs</span><span style="color: #000000">&nbsp;(cmds)&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.cmds[</span><span style="color: #000000">#</span><span style="color: #000000">self.cmds&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;v<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;wakeup&nbsp;to&nbsp;process</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;self:Wakeup()<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Command:Clear()<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.cmds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{}<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Command:Wakeup()<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(self.thread&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdSender.thread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">coroutine.create</span><span style="color: #000000">(cmdSender.Do)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">not</span><span style="color: #000000">&nbsp;self.isRunning)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">coroutine.resume</span><span style="color: #000000">(self.thread)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Command:Do()<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;cmd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">#</span><span style="color: #000000">cmdSender.cmds&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cmdSender.cmds[</span><span style="color: #800080">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;pick&nbsp;cmd&nbsp;in&nbsp;queue</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">table.remove</span><span style="color: #000000">&nbsp;(cmdSender.cmds,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #008000">--</span><span style="color: #008000">&nbsp;remove&nbsp;cmd&nbsp;in&nbsp;queue</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(cmd&nbsp;</span><span style="color: #000000">~=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">nil</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdSender.isRunning&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #ff00ff">string.sub</span><span style="color: #000000">(cmd,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">@</span><span style="color: #800000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">local</span><span style="color: #000000">&nbsp;interval&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">tonumber</span><span style="color: #000000">(</span><span style="color: #ff00ff">string.sub</span><span style="color: #000000">(cmd,&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(interval&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helper:Print(</span><span style="color: #800000">"</span><span style="color: #800000">delay:</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;interval)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DoAfterSpecial(interval,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">coroutine.resume(cmdSender.thread)</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">12</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">coroutine.yield</span><span style="color: #000000">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdSender:Send(cmd)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdSender.isRunning&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">coroutine.yield</span><span style="color: #000000">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Command:Send(cmd)<br />
&nbsp;&nbsp;&nbsp;&nbsp;helper:Print(</span><span style="color: #800000">"</span><span style="color: #800000">cmd:</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;cmd)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(IsAlias(cmd)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;error_code.eOK)&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendImmediate(GetAliasInfo(cmd,&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendImmediate(cmd)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">end</span><span style="color: #000000"><br />
<br />
cmdSender&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Command.new()</span></div>
 <img src="http://www.cnblogs.com/wj/aggbug/1241569.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/wj/archive/2008/07/12/1241569.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wj/archive/2008/07/12/1241569.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56859/" target="_blank">美调查公司称苹果iPad配件成本最低219美元</a><span style="color:gray">(2010-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/56858/" target="_blank">摩尔庄园：儿童生意密码</a><span style="color:gray">(2010-02-10 17:15)</span><br/>· <a href="http://news.cnblogs.com/n/56857/" target="_blank">Facebook与美国在线合作 整合AIM动态功能</a><span style="color:gray">(2010-02-10 16:41)</span><br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>巧用Marshal.GetDelegateForFunctionPointer--C#如何调用按键精灵插件dll</title><link>http://www.cnblogs.com/wj/archive/2008/02/10/1066585.html</link><dc:creator>绿叶</dc:creator><author>绿叶</author><pubDate>Sun, 10 Feb 2008 07:20:00 GMT</pubDate><guid>http://www.cnblogs.com/wj/archive/2008/02/10/1066585.html</guid><description><![CDATA[<p>阅读: 3808 评论: 12 作者: <a href="http://www.cnblogs.com/wj/" target="_blank">绿叶</a> 发表于 2008-02-10 15:20 <a href="http://www.cnblogs.com/wj/archive/2008/02/10/1066585.html" target="_blank">原文链接</a></p><p>原来是为了在游戏外挂中发送键盘鼠标消息，自己写个sendmessage或者是postmessage又比较麻烦。于是google了一下，发现现在很多脚本工具都有这个功能，其中按键精灵的一个叫361度的插件已经有这个的实现，还验证过了。为什么不拿来己用呢？<br />
首先分析一下按键精灵插件的接口，发现：<br />
<img height="83" alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/QMacro/interfaces.JPG" width="357" border="0" /><br />
插件的功能函数没有直接暴露出来，而是通过一个GetCommand的函数返回一个函数描述结构。<br />
接下来看看这个结构：<br />
<img height="115" alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/QMacro/QMPLUGIN_CMD_INFO.JPG" width="243" border="0" /><br />
上面这个结构我已经是转换成C#的对应结构了，原结构可以查看按键精灵提供的插件C++接口源代码。<br />
这个结构里面的 handlerFunction 实际上是指向函数的入口点，也就是一个函数指针，每个函数都一样是2个参数：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">typedef&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">QMPLUGIN_HANDLER)(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">lpszParamList,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">lpszRetVal);</span></div>
<p>转换为C#中相应的委托为：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">delegate</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Invoker(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;parameters,&nbsp;StringBuilder&nbsp;returnValue);</span></div>
<br />
大家注意到，有两个参数，c++原型中都是char*类型，转换为C#的delegate后第一个为string，第二个为StringBuilder。这是因为parameters是in的，dll中不会对这个参数做修改，而returnValue是out的，dll返回时候要把返回值写入这个StringBuilder的缓冲区。<br />
<br />
原本的想法是用C++写一个桥来调用dll，不过在.net 2.0 中，框架直接提供了 <font face="Verdana">Marshal.GetDelegateForFunctionPointer</font> 来转换一个函数指针为一个委托，这就方便多拉。请看下面代码，注意看 <font face="Verdana">BGKM_ExecuteCommand</font> 这个函数里面的东西。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Runtime.InteropServices;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;WJsHome.Game.Utility<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;QMacro<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport(</span><span style="color: #800000">"</span><span style="color: #800000">BGKM5.dll</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;EntryPoint&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">GetCommand</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;IntPtr&nbsp;BGKM_GetCommand(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;commandNum);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[StructLayout(LayoutKind.Sequential)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;QMPLUGIN_CMD_INFO<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;commandName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;commandDescription;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IntPtr&nbsp;handlerFunction;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">uint</span><span style="color: #000000">&nbsp;paramNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">delegate</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Invoker(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;parameters,&nbsp;StringBuilder&nbsp;returnValue);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;BuildParameters(</span><span style="color: #0000ff">params</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">[]&nbsp;parameters)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuilder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;parameters.Length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(parameters[i].ToString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;parameters.Length&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(</span><span style="color: #800000">'</span><span style="color: #800000">,</span><span style="color: #800000">'</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sb.ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;BGKM_ExecuteCommand(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cmdNum,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;parameters,&nbsp;StringBuilder&nbsp;retVal)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr&nbsp;pCmdInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;BGKM_GetCommand(cmdNum);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QMPLUGIN_CMD_INFO&nbsp;cmdInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QMPLUGIN_CMD_INFO();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Marshal.PtrToStructure(pCmdInfo,&nbsp;cmdInfo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Invoker&nbsp;invoker&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Marshal.GetDelegateForFunctionPointer(cmdInfo.handlerFunction,&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(Invoker))&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;Invoker;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invoker(parameters,&nbsp;retVal);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;BGKM_KeyClick(IntPtr&nbsp;hWnd,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;key)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BGKM_ExecuteCommand(</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;BuildParameters(hWnd,&nbsp;key),&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;BGKM_KeyDown(IntPtr&nbsp;hWnd,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;key)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BGKM_ExecuteCommand(</span><span style="color: #800080">1</span><span style="color: #000000">,&nbsp;BuildParameters(hWnd,&nbsp;key),&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;BGKM_Mouse(IntPtr&nbsp;hWnd,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;code,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BGKM_ExecuteCommand(</span><span style="color: #800080">15</span><span style="color: #000000">,&nbsp;BuildParameters(hWnd,&nbsp;code,&nbsp;x,&nbsp;y),&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;WinApi.POINT&nbsp;BGKM_ScrToCli(IntPtr&nbsp;hWnd,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;retVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuilder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BGKM_ExecuteCommand(</span><span style="color: #800080">16</span><span style="color: #000000">,&nbsp;BuildParameters(hWnd,&nbsp;x,&nbsp;y),&nbsp;retVal);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;retVal.ToString().Split(</span><span style="color: #800000">'</span><span style="color: #800000">|</span><span style="color: #800000">'</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;WinApi.POINT(</span><span style="color: #0000ff">int</span><span style="color: #000000">.Parse(tmp[</span><span style="color: #800080">0</span><span style="color: #000000">]),&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">.Parse(tmp[</span><span style="color: #800080">1</span><span style="color: #000000">]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<hr />
<br />
好了，方便哇？这样一来，我们可以在.net上面实现动态加载和卸载Win32 dll. 具体思路就是：（还是代码来得方便）<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">delegate</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MsgBox(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;hwnd,</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;msg,</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;cpp,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ok);<br />
<br />
[DllImport(</span><span style="color: #800000">"</span><span style="color: #800000">Kernel32</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetProcAddress(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;handle,&nbsp;String&nbsp;funcname);<br />
[DllImport(</span><span style="color: #800000">"</span><span style="color: #800000">Kernel32</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;LoadLibrary(String&nbsp;funcname);<br />
[DllImport(</span><span style="color: #800000">"</span><span style="color: #800000">Kernel32</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;FreeLibrary(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;handle);<br />
<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Delegate&nbsp;GetAddress(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;dllModule,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;functionname,&nbsp;Type&nbsp;t)<br />
{<br />
　</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;addr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetProcAddress(dllModule,&nbsp;functionname);<br />
　</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(addr&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)&nbsp;<br />
　　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
　</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br />
　　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;Marshal.GetDelegateForFunctionPointer(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IntPtr(addr),&nbsp;t);<br />
}<br />
<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;button1_Click(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
{<br />
　</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;huser32&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
　huser32&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;LoadLibrary(</span><span style="color: #800000">"</span><span style="color: #800000">user32.dll</span><span style="color: #800000">"</span><span style="color: #000000">);&nbsp;<br />
　MsgBox&nbsp;mymsg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(MsgBox)GetAddress(huser32,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">MessageBoxA</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(MsgBox));<br />
　mymsg(</span><span style="color: #0000ff">this</span><span style="color: #000000">.Handle.ToInt32(),&nbsp;txtmsg.Text,&nbsp;txttitle.Text&nbsp;,&nbsp;</span><span style="color: #800080">64</span><span style="color: #000000">);<br />
　FreeLibrary(huser32);<br />
}</span></div>
上面代码是从internet上copy下来的，anyway, enjoy<img src="http://www.cnblogs.com/Emoticons/qface/055243188.gif"  alt="" />~
 <img src="http://www.cnblogs.com/wj/aggbug/1066585.html?type=1" width="1" height="1" alt=""/><p>评论: 12　<a href="http://www.cnblogs.com/wj/archive/2008/02/10/1066585.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wj/archive/2008/02/10/1066585.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56859/" target="_blank">美调查公司称苹果iPad配件成本最低219美元</a><span style="color:gray">(2010-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/56858/" target="_blank">摩尔庄园：儿童生意密码</a><span style="color:gray">(2010-02-10 17:15)</span><br/>· <a href="http://news.cnblogs.com/n/56857/" target="_blank">Facebook与美国在线合作 整合AIM动态功能</a><span style="color:gray">(2010-02-10 16:41)</span><br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Using .Net, Flex, and Red5 to create a flash web application</title><link>http://www.cnblogs.com/wj/archive/2008/01/18/1043750.html</link><dc:creator>绿叶</dc:creator><author>绿叶</author><pubDate>Thu, 17 Jan 2008 17:15:00 GMT</pubDate><guid>http://www.cnblogs.com/wj/archive/2008/01/18/1043750.html</guid><description><![CDATA[<p>阅读: 3954 评论: 22 作者: <a href="http://www.cnblogs.com/wj/" target="_blank">绿叶</a> 发表于 2008-01-18 01:15 <a href="http://www.cnblogs.com/wj/archive/2008/01/18/1043750.html" target="_blank">原文链接</a></p>This project i developed recently is a web <font face="Verdana">conference application.<br />
i used .net with C# to write the web service providing the data access layer(dal) to the flash application for authentication and account management. Red5 server is an open source "flash stream server", JAVA is applyed here to write some handlers to process the stream data including the video and audio. Went without saying, Flex is used to develop the interface of the webside. The Red5 server and flash client is two way interaction, which means the flash client is able to send a request to the red5 server, so does red5, which can invoke client functions as well.<br />
<br />
here i post the source code, you have to understand some concepts of red5 before reading:<br />
1. the scope in Red5<br />
a scope is used to group resouces, an Application has two kinds of scope. one is the app scope, the root scope in an application. second is the child scope. they are formed in a tree structure.<br />
2. scope in my application<br />
u'll see the source code in the application.java, there are a hall and many rooms. you will enter the hall after authentication, and can create or join a room in the hall. Notice that both hall and room are child scopes. hall scope is created only once by red5 automatically while the first user entering the hall. room scope is created when a user start a new room.<br />
3. message exchange<br />
the flash client can send public message or publish video/audio stream to the red5 server, and then these messages or stream data will be transmit to the users who are in the same room. itz real time and <font face="Verdana">asynchronous</font>.<br />
<br />
how to make it work:<br />
1. having MS Sql server.<br />
create a database named "xyz" and create a table named "users" with 5 columns: Id(PK), Password, Email, Sex, and Description. you can get it done by running the dbScript.txt in your ms-sql server after the creation of database.<br />
2. running web service<br />
you can run the webservice directly with vistual studio 2005, or put the web service in iis. if u run it in vs2005, u might have to change the port number in the flash client. make sure it works.<br />
3. running flash<br />
open the flash client code source with Flex builder 2.1 (can download from Adobo), <font face="Verdana">compile</font> it, you'd better put the bin code in IIS as well.<br />
4. running Red5 server<br />
i used <font face="Verdana">Eclipse</font> to developed the Red5 handler, there might be some problems of using <font face="Verdana">Eclipse to make red5 running at the beginning. search the solusion in Red5 webside <font face="Verdana"><a href="http://osflash.org/red5">http://osflash.org/red5</a>, and create a new application called "XyzTalk", u can directly import my code&nbsp;into your red5 project. and finally build it.<br />
</font></font>5. done<br />
once you get everything done correctly, u will see the beautiful interface (no? dam!) below:<br />
<br />
login:<br />
<img height="253" alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/xyz/login.jpg" width="300" border="0" /><br />
<br />
register:<br />
<img height="439" alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/xyz/register.jpg" width="430" border="0" /><br />
<br />
hall:<br />
<img height="562" alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/xyz/hall.jpg" width="669" border="0" /><br />
<br />
room:<br />
<img height="624" alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/xyz/room.jpg" width="822" border="0" /><br />
<br />
download URL:<br />
<a href="http://www.cnblogs.com/Files/wj/xyz.rar">/Files/wj/xyz.rar</a><br />
<br />
btw, i didn't finish the shaing files part, yup. if any recommendations or bugs u firgure out, just leave msg or send me an email.<br />
enjoy~ bye~<br />
</font>
  <img src="http://www.cnblogs.com/wj/aggbug/1043750.html?type=1" width="1" height="1" alt=""/><p>评论: 22　<a href="http://www.cnblogs.com/wj/archive/2008/01/18/1043750.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wj/archive/2008/01/18/1043750.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56859/" target="_blank">美调查公司称苹果iPad配件成本最低219美元</a><span style="color:gray">(2010-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/56858/" target="_blank">摩尔庄园：儿童生意密码</a><span style="color:gray">(2010-02-10 17:15)</span><br/>· <a href="http://news.cnblogs.com/n/56857/" target="_blank">Facebook与美国在线合作 整合AIM动态功能</a><span style="color:gray">(2010-02-10 16:41)</span><br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>做了个C#的Hotkey简单封装，希望对大家有帮助</title><link>http://www.cnblogs.com/wj/archive/2007/10/18/929026.html</link><dc:creator>绿叶</dc:creator><author>绿叶</author><pubDate>Thu, 18 Oct 2007 06:27:00 GMT</pubDate><guid>http://www.cnblogs.com/wj/archive/2007/10/18/929026.html</guid><description><![CDATA[<p>阅读: 3041 评论: 14 作者: <a href="http://www.cnblogs.com/wj/" target="_blank">绿叶</a> 发表于 2007-10-18 14:27 <a href="http://www.cnblogs.com/wj/archive/2007/10/18/929026.html" target="_blank">原文链接</a></p>本来听说winapi里面的<font face="Verdana">RegisterHotKey有时候不好使，于是打算用hook键盘消息来做hook key，结果发现hook那里处理消息那里还挺麻烦，也想会不会造成系统的额外开销比较大，所以最后用<font face="Verdana">RegisterHotKey</font>来封装了一下，测试没有问题，还是可以的。（winform）<br />
下面的代码包括一个Textbox的处理，和一个封装了api的类。Textbox那里就是处理用户定义的热键的界面表示，比如用户按键的时候会出现"Ctrl+Alt+A"之类的，Api封装那里做了处理，只管Register好了，不用管UnRegister，当注册一个一样的Id的hotkey，会自动先UnRegister原来的，然后最后关闭窗口的时候，调用一下HotkeyHelper.Dispose()就可以了。还希望多加建议。here we go..<br />
<hr />
Textbox部分：(Key hotkeyVk = null;)<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;txbHotKey_KeyDown(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;KeyEventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txbHotKey.Text&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">.Empty;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.Control)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txbHotKey.Text&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Ctrl+</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.Alt)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txbHotKey.Text&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Alt+</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.Shift)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txbHotKey.Text&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Shift+</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.KeyCode&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;Keys.A&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;e.KeyCode&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;Keys.Z)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.Modifiers&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;Keys.None)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txbHotKey.Text&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;e.KeyCode.ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotkeyVk&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;e.KeyCode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.KeyCode&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;Keys.D0&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;e.KeyCode&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;Keys.D9)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.Modifiers&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;Keys.None)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txbHotKey.Text&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;e.KeyCode.ToString().Remove(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotkeyVk&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;e.KeyCode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.KeyCode&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;Keys.NumPad0&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;e.KeyCode&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;Keys.NumPad9)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.Modifiers&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;Keys.None)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txbHotKey.Text&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;e.KeyCode.ToString().Replace(</span><span style="color: #000000">"</span><span style="color: #000000">Pad</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotkeyVk&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;e.KeyCode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.KeyCode&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;Keys.F1&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;e.KeyCode&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;Keys.F12)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txbHotKey.Text&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;e.KeyCode.ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotkeyVk&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;e.KeyCode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.SuppressKeyPress&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.Handled&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;txbHotKey_KeyPress(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;KeyPressEventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.Handled&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;txbHotKey_KeyUp(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;KeyEventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CheckHotkey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;txbHotKey_LostFocus(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CheckHotkey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CheckHotkey()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(txbHotKey.Text.EndsWith(</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;txbHotKey.Text&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">.Empty)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txbHotKey.Text&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">无</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;btnHotKey_Click(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;hotkey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;txbHotKey.Text.Replace(</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(hotkey&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">无</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;hotkey&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">.Empty)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">uint</span><span style="color: #000000">&nbsp;modifies&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(hotkey.Contains(</span><span style="color: #000000">"</span><span style="color: #000000">Ctrl</span><span style="color: #000000">"</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modifies&nbsp;</span><span style="color: #000000">|=</span><span style="color: #000000">&nbsp;HotkeyHelper.MOD_CONTROL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotkey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hotkey.Replace(</span><span style="color: #000000">"</span><span style="color: #000000">Ctrl</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(hotkey.Contains(</span><span style="color: #000000">"</span><span style="color: #000000">Alt</span><span style="color: #000000">"</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modifies&nbsp;</span><span style="color: #000000">|=</span><span style="color: #000000">&nbsp;HotkeyHelper.MOD_ALT;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotkey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hotkey.Replace(</span><span style="color: #000000">"</span><span style="color: #000000">Alt</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(hotkey.Contains(</span><span style="color: #000000">"</span><span style="color: #000000">Shift</span><span style="color: #000000">"</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modifies&nbsp;</span><span style="color: #000000">|=</span><span style="color: #000000">&nbsp;HotkeyHelper.MOD_SHIFT;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotkey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hotkey.Replace(</span><span style="color: #000000">"</span><span style="color: #000000">Shift</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GameProvider.HotkeyHelper.RegisterHotKey(</span><span style="color: #0000ff">this</span><span style="color: #000000">.Handle,&nbsp;hotkeyId,&nbsp;modifies,&nbsp;(</span><span style="color: #0000ff">uint</span><span style="color: #000000">)hotkeyVk);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
HotkeyHelper部分：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;GFSucker.Game.Utility;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;GFSucker.Game.Provider<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HotkeyHelper&nbsp;:&nbsp;IDisposable<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MOD_ALT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x1</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MOD_CONTROL&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x2</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MOD_SHIFT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x4</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MOD_WIN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x8</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;WM_HOTKEY&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x312</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Dictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">,&nbsp;Hotkey</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;dicHotkeys;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;HotkeyHelper()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dicHotkeys&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Dictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">,&nbsp;Hotkey</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;RegisterHotKey(IntPtr&nbsp;hWnd,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id,&nbsp;</span><span style="color: #0000ff">uint</span><span style="color: #000000">&nbsp;fsModifiers,&nbsp;</span><span style="color: #0000ff">uint</span><span style="color: #000000">&nbsp;vk)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dicHotkeys.ContainsKey(id))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dicHotkeys[id].IsRegistered)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UnregisterHotKey(dicHotkeys[id].HWnd,&nbsp;id);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;unregister&nbsp;firstly</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dicHotkeys[id].IsRegistered&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dicHotkeys[id].HWnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hWnd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;set&nbsp;the&nbsp;new&nbsp;hwnd&nbsp;(normally&nbsp;should&nbsp;be&nbsp;the&nbsp;same)</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dicHotkeys.Add(id,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Hotkey(hWnd,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dicHotkeys[id].IsRegistered&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;WinApi.RegisterHotKey(hWnd,&nbsp;id,&nbsp;fsModifiers,&nbsp;vk);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;dicHotkeys[id].IsRegistered;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;UnregisterHotKey(IntPtr&nbsp;hWnd,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;WinApi.UnregisterHotKey(hWnd,&nbsp;id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;Hotkey&nbsp;Information</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Hotkey<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Hotkey(IntPtr&nbsp;hWnd,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;isRegistered)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_HWnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hWnd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_IsRegistered&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;isRegistered;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IntPtr&nbsp;_HWnd;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IntPtr&nbsp;HWnd<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;_HWnd;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;{&nbsp;_HWnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;_IsRegistered;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;IsRegistered<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;_IsRegistered;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;{&nbsp;_IsRegistered&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;IDisposable&nbsp;成员</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Dispose()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;dicHotkeys.Keys)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dicHotkeys[id].IsRegistered)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UnregisterHotKey(dicHotkeys[id].HWnd,&nbsp;id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
Winapi声明：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport(</span><span style="color: #000000">"</span><span style="color: #000000">user32.dll</span><span style="color: #000000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #0000ff">return</span><span style="color: #000000">:&nbsp;MarshalAs(UnmanagedType.Bool)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;RegisterHotKey(IntPtr&nbsp;hWnd,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id,&nbsp;</span><span style="color: #0000ff">uint</span><span style="color: #000000">&nbsp;fsModifiers,&nbsp;</span><span style="color: #0000ff">uint</span><span style="color: #000000">&nbsp;vk);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport(</span><span style="color: #000000">"</span><span style="color: #000000">user32.dll</span><span style="color: #000000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #0000ff">return</span><span style="color: #000000">:&nbsp;MarshalAs(UnmanagedType.Bool)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;UnregisterHotKey(IntPtr&nbsp;hWnd,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id);</span></div>
</font><br />
Override winform窗体的<font face="Verdana">WndProc</font>:(就是接受到hotkey信息的时候，做你想做的东西)<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;WndProc(</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;Message&nbsp;m)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.WndProc(</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;m);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m.Msg&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;HotkeyHelper.WM_HOTKEY)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MainForm&nbsp;mainform&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;MainForm;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(mainform&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(mainform.WindowState&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;FormWindowState.Minimized)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainform.WindowState&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;FormWindowState.Normal;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainform.Activate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
<hr />
<br />
因为直接从程序中copy出来的，代码没有很多注释，不过都是非常浅显易懂的东西，名字看上去还是一目了然的，另外说一句，我觉得如果重构得比较好的代码是不需要做过多的注释的，代码本身就是注释，注释用在解释一些比较混乱的行为意图。希望对大家有帮助咯。bye~
 <img src="http://www.cnblogs.com/wj/aggbug/929026.html?type=1" width="1" height="1" alt=""/><p>评论: 14　<a href="http://www.cnblogs.com/wj/archive/2007/10/18/929026.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wj/archive/2007/10/18/929026.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56859/" target="_blank">美调查公司称苹果iPad配件成本最低219美元</a><span style="color:gray">(2010-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/56858/" target="_blank">摩尔庄园：儿童生意密码</a><span style="color:gray">(2010-02-10 17:15)</span><br/>· <a href="http://news.cnblogs.com/n/56857/" target="_blank">Facebook与美国在线合作 整合AIM动态功能</a><span style="color:gray">(2010-02-10 16:41)</span><br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>功夫世界外挂发布测试</title><link>http://www.cnblogs.com/wj/archive/2007/10/10/GongFuCheaterRelease.html</link><dc:creator>绿叶</dc:creator><author>绿叶</author><pubDate>Wed, 10 Oct 2007 05:55:00 GMT</pubDate><guid>http://www.cnblogs.com/wj/archive/2007/10/10/GongFuCheaterRelease.html</guid><description><![CDATA[<p>阅读: 11831 评论: 102 作者: <a href="http://www.cnblogs.com/wj/" target="_blank">绿叶</a> 发表于 2007-10-10 13:55 <a href="http://www.cnblogs.com/wj/archive/2007/10/10/GongFuCheaterRelease.html" target="_blank">原文链接</a></p><span style="color: red">2007-10-23: <span style="color: #000000">程序暂停更新，服务器关闭一段时间<br />
</span>2007-10-22: <span style="color: #000000">增加【定时技能】，有bug请提交<br />
</span>2007-10-22: <span style="color: #000000">改进程序结构<br />
</span>2007-10-14: <span style="color: #000000">增加【装备切换】功能<br />
</span>2007-10-12: <span style="color: #000000">增加程序热键呼叫功能<br />
</span>2007-10-11: <span style="color: #000000">增加窗口隐藏，大小调整等系列功能</span><br />
2007-10-11: <span style="color: #000000">增加【超级视角】功能<br />
</span>2007-10-10: <span style="color: #000000">增加【自动丢弃】物品功能<br />
</span>2007-10-10: <span style="color: #000000">合理布局程序界面<br />
</span>2007-10-09: <span style="color: #000000">同步更新支持游戏至"<font face="Verdana">1.0.20b R"</font>版本<br />
</span>2007-10-07:</span> 开启测试QQ群号：<span style="color: #0000ff">10925476</span> <br />
<br />
使用步骤：<br />
<font face="Verdana">1.安装.Net Framework 2<br />
2.在<span style="color: #0000ff">QQ的共享下载</span>外挂<br />
3.解压程序到任意目录<br />
4.用户名和密码任意<br />
*.服务器在国外,加载可能比较慢.*<br />
<br />
外挂特点：<br />
*.完全后台挂机化<br />
*.非常高效的寻怪算法，不依赖Tab键<br />
*.自动抛弃垃圾物品，并且可自定义，你的背包永远不会存在垃圾<br />
*.强大简便的装备自动切换功能，更胜一筹<br />
*.自动捡取（高效）<br />
*.定点挂机<br />
*.外挂配置实时话，可以即时改变挂机配置不用停止再重新启动外挂<br />
*.使用.Net Remoting技术使你永远使用最新版本外挂<br />
*.游戏资源提供当前场景所有可用信息，双击可跑到怪物面前，双击背包列表使用物品<br />
<br />
*.Net Framework 2 下载地址:<br />
<font face="Verdana"><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&amp;displaylang=zh-cn">http://www.microsoft.com/downloads/details.aspx?FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&amp;displaylang=zh-cn</a><br />
<br />
*.最新截图:<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/106886/o_gf3.JPG" border="0" /><br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/106886/o_gf2.JPG" border="0" /><br />
<img height="543" alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/106886/o_g1.JPG" width="831" border="0" /></font></font>&nbsp; 
  <img src="http://www.cnblogs.com/wj/aggbug/919560.html?type=1" width="1" height="1" alt=""/><p>评论: 102　<a href="http://www.cnblogs.com/wj/archive/2007/10/10/GongFuCheaterRelease.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wj/archive/2007/10/10/GongFuCheaterRelease.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56859/" target="_blank">美调查公司称苹果iPad配件成本最低219美元</a><span style="color:gray">(2010-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/56858/" target="_blank">摩尔庄园：儿童生意密码</a><span style="color:gray">(2010-02-10 17:15)</span><br/>· <a href="http://news.cnblogs.com/n/56857/" target="_blank">Facebook与美国在线合作 整合AIM动态功能</a><span style="color:gray">(2010-02-10 16:41)</span><br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>我的第一个全后台CALL外挂-功夫世界外挂</title><link>http://www.cnblogs.com/wj/archive/2007/09/21/Word_Of_GongFu_Cheater_by_WJsHome.html</link><dc:creator>绿叶</dc:creator><author>绿叶</author><pubDate>Fri, 21 Sep 2007 08:01:00 GMT</pubDate><guid>http://www.cnblogs.com/wj/archive/2007/09/21/Word_Of_GongFu_Cheater_by_WJsHome.html</guid><description><![CDATA[<p>阅读: 8372 评论: 131 作者: <a href="http://www.cnblogs.com/wj/" target="_blank">绿叶</a> 发表于 2007-09-21 16:01 <a href="http://www.cnblogs.com/wj/archive/2007/09/21/Word_Of_GongFu_Cheater_by_WJsHome.html" target="_blank">原文链接</a></p><p><span style="color: red">*&nbsp;外挂进入测试阶段，在此查看外挂下载信息：</span><br />
<a href="http://www.cnblogs.com/wj/archive/2007/10/10/GongFuCheaterRelease.html">http://www.cnblogs.com/wj/archive/2007/10/10/GongFuCheaterRelease.html</a>
<hr />
花了三个星期的空余时间写下此挂，目的是为了锻炼一下汇编方面的知识，怎么跟踪，反跟踪，调试等。整个挂用C#编写，全部实现的游戏功能都是通过直接Call游戏函数实现，所以可以说是完全后台的。其实我写代码的时间并不算很多，我把大部分时间放在代码的重构上面，就自己看起来的代码感觉挺满意，就此贴图以表纪念。<br />
<br />
<img style="width: 693px; height: 575px" height="575" alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/106886/o_GFWord.JPG" width="693" border="0" /><br />
（原图：<a href="http://www.cnblogs.com/images/cnblogs_com/wj/106886/o_GFWord.JPG">http://www.cnblogs.com/images/cnblogs_com/wj/106886/o_GFWord.JPG</a>)<br />
在外挂的主界面中，双击NPC名称即<span style="color: red">自动行走</span>到相应的NPC位置（位置是你当前按刷新时NPC的位置），双击背包可以直接<span style="color: red">使用物品</span>。挂机功能经我调试后已经非常之完善。还有就是<span style="color: red">自动捡东西</span>的功能，已经完全可以代替游戏中用元宝买的&#8220;捡垃圾猪&#8221;。在设计<span style="color: red">定点打怪挂机</span>机器人逻辑时候，很难避免多线程的问题，比如补血线程和寻怪线程之间的通讯，补血线程发现要打坐回复，就通知打怪线程停止打怪，然后打坐，血满了再通知继续打怪。后来经过一番改造，已经很完满的解决这个技术问题，我再对游戏中的各个模块进行了封装，如果要开发另外一个游戏的外挂，可重用性是非常之高的。如果做过外挂的人都知道，需要内存数据的基址，然而这些数据在游戏升级时会变动，所以以后对付游戏升级可以用特征码的方法寻找基址。在我的程序中，所有内存地址数据，包括他们之间的依赖关系都是可配置的，程序会根据配置的数据，自动计算表达式的值，并可以指定数据是否缓存等。所以在对付游戏升级造成的内存地址数据变化有一定的弹性，现在我在处理中的问题是如何更有效的对付Call地址的变化，现在这部分我是hard code程序里面的，将来我想把他都全部变成可配置话，这样灵活度就非常之高了。以后会发更多的自动化机器人，比如<span style="color: red">自动采集</span>等<br />
<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/106886/o_Design.JPG" border="0" /><br />
一个游戏的好坏，除开这个游戏本身的内涵之外，另外一个最大问题就是代理商。对于《大航海时代Online》的倒闭，我感到非常遗憾。
<p>&nbsp;</p>
<img src="http://www.cnblogs.com/wj/aggbug/901488.html?type=1" width="1" height="1" alt=""/><p>评论: 131　<a href="http://www.cnblogs.com/wj/archive/2007/09/21/Word_Of_GongFu_Cheater_by_WJsHome.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wj/archive/2007/09/21/Word_Of_GongFu_Cheater_by_WJsHome.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56859/" target="_blank">美调查公司称苹果iPad配件成本最低219美元</a><span style="color:gray">(2010-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/56858/" target="_blank">摩尔庄园：儿童生意密码</a><span style="color:gray">(2010-02-10 17:15)</span><br/>· <a href="http://news.cnblogs.com/n/56857/" target="_blank">Facebook与美国在线合作 整合AIM动态功能</a><span style="color:gray">(2010-02-10 16:41)</span><br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>通过修改Mutex来达到大航海OL多开</title><link>http://www.cnblogs.com/wj/archive/2007/03/28/690659.html</link><dc:creator>绿叶</dc:creator><author>绿叶</author><pubDate>Tue, 27 Mar 2007 23:48:00 GMT</pubDate><guid>http://www.cnblogs.com/wj/archive/2007/03/28/690659.html</guid><description><![CDATA[<p>阅读: 3430 评论: 3 作者: <a href="http://www.cnblogs.com/wj/" target="_blank">绿叶</a> 发表于 2007-03-28 07:48 <a href="http://www.cnblogs.com/wj/archive/2007/03/28/690659.html" target="_blank">原文链接</a></p>这里再发一个多开大航海OL的启动方法。大航海OL通过创建Mutex来防止多开，直接修改GVOnline.bin文件即可：<br><br><img height=143 alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/DOL_M.JPG" width=530 border=0><br><br>把地址<span style="COLOR: red">0x00077457</span>中的74修改成EB即可，大家可以用UltraEdit修改，这里post一个已经修改过的GVOnline.bin文件。<br><br><img height=66 alt="" src="http://www.cnblogs.com/images/cnblogs_com/wj/DOL_M2.JPG" width=629 border=0><br><br>直接把他解压到游戏目录，将他改名成随便一个exe名字，双击就可以启动，再也不用去新建用户了，而且连更新也跳过了。爽哉？<br><br>适用 2007-3-26 更新文件：<a href="http://www.cnblogs.com/Files/wj/GVOnline.bin.rar">http://www.cnblogs.com/Files/wj/GVOnline.bin.rar</a><br><br>相关连接：<a href="http://www.cnblogs.com/wj/archive/2007/03/27/689482.html">http://www.cnblogs.com/wj/archive/2007/03/27/689482.html</a> 
<img src="http://www.cnblogs.com/wj/aggbug/690659.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/wj/archive/2007/03/28/690659.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wj/archive/2007/03/28/690659.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56859/" target="_blank">美调查公司称苹果iPad配件成本最低219美元</a><span style="color:gray">(2010-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/56858/" target="_blank">摩尔庄园：儿童生意密码</a><span style="color:gray">(2010-02-10 17:15)</span><br/>· <a href="http://news.cnblogs.com/n/56857/" target="_blank">Facebook与美国在线合作 整合AIM动态功能</a><span style="color:gray">(2010-02-10 16:41)</span><br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>