public abstract class KeyboardHookEventListener implements HookEventListener{
1public void acceptHookData(HookData arg0) { 2 KeyboardHookData khd = ((KeyboardHookData) arg0); 3 { 4 if(khd.getTransitionState()) //处理按下事件 5 { 6 doPress(khd.getWParam()); 7 } 8 else 9 { 10 doReleased(khd.getWParam()); //处理释放事件 11 } 12 } 13} 14public abstract void doPress(int keyNum); 15public abstract void doReleased(int keyNum);
}</pre>
<p> 接着再定义一个抽象类到拦截鼠标事件,如下:</p> <div class="dp-highlighter" id=""><div class="bar"><div class="tools">Java代码 <embed wmode="transparent" src="https://my.oschina.net/javascripts/syntaxhighlighter/clipboard\_new.swf" width="14" height="15" flashvars="clipboard=import%20org.sf.feeling.swt.win32.extension.hook.data.HookData%3B%0Aimport%20org.sf.feeling.swt.win32.extension.hook.data.MouseHookData%3B%0Aimport%20org.sf.feeling.swt.win32.extension.hook.listener.HookEventListener%3B%0A%0Apublic%20abstract%20class%20MouseHookEventListener%20implements%20HookEventListener%7B%0A%09%0A%09public%20void%20acceptHookData(HookData%20hookData)%20%7B%0A%09%09int%20x%3D((MouseHookData)%20hookData).getPointX()%3B%0A%09%09int%20y%3D((MouseHookData)%20hookData).getPointY()%3B%0A%09%09switch(hookData.getWParam())%0A%09%09%7B%0A%09%09case%20513%3A%0A%09%09%09doLeftPressed(x%2Cy)%3B%0A%09%09%09break%3B%0A%09%09case%20514%3A%0A%09%09%09doLeftReleased(x%2Cy)%3B%0A%09%09%09break%3B%0A%09%09case%20516%3A%0A%09%09%09doRightPressed(x%2Cy)%3B%0A%09%09%09break%3B%0A%09%09case%20517%3A%0A%09%09%09doRightReleased(x%2Cy)%3B%0A%09%09%09break%3B%0A%09%09case%20519%3A%0A%09%09%09doMiddlePressed(x%2Cy)%3B%0A%09%09%09break%3B%0A%09%09case%20520%3A%0A%09%09%09doMiddleReleased(x%2Cy)%3B%0A%09%09%09break%3B%0A%09%09default%3A%0A%09%09%7D%0A%09%7D%0A%0A%09protected%20abstract%20void%20doLeftPressed(int%20x%2Cint%20y)%3B%0A%09protected%20abstract%20void%20doLeftReleased(int%20x%2Cint%20y)%3B%0A%09protected%20abstract%20void%20doRightPressed(int%20x%2Cint%20y)%3B%0A%09protected%20abstract%20void%20doRightReleased(int%20x%2Cint%20y)%3B%0A%09protected%20abstract%20void%20doMiddlePressed(int%20x%2Cint%20y)%3B%0A%09protected%20abstract%20void%20doMiddleReleased(int%20x%2Cint%20y)%3B%0A%7D" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="javascript:void()" title="收藏这段代码" onclick="code\_favorites\_do\_favorite(this);return false;"><img class="star" src="https://my.oschina.net/images/icon\_star.png" alt="收藏代码"><img class="spinner" src="https://my.oschina.net/images/spinner.gif" style="display:none"></a></div></div><ol start="1" class="dp-j"><li><span><span class="keyword">import</span><span> org.sf.feeling.swt.win32.extension.hook.data.HookData; </span></span></li><li><span><span class="keyword">import</span><span> org.sf.feeling.swt.win32.extension.hook.data.MouseHookData; </span></span></li><li><span><span class="keyword">import</span><span> org.sf.feeling.swt.win32.extension.hook.listener.HookEventListener; </span></span></li><li><span> </span></li><li><span><span class="keyword">public</span><span> </span><span class="keyword">abstract</span><span> </span><span class="keyword">class</span><span> MouseHookEventListener </span><span class="keyword">implements</span><span> HookEventListener{ </span></span></li><li><span> </span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> acceptHookData(HookData hookData) { </span></span></li><li><span> <span class="keyword">int</span><span> x=((MouseHookData) hookData).getPointX(); </span></span></li><li><span> <span class="keyword">int</span><span> y=((MouseHookData) hookData).getPointY(); </span></span></li><li><span> <span class="keyword">switch</span><span>(hookData.getWParam()) </span></span></li><li><span> { </span></li><li><span> <span class="keyword">case</span><span> </span><span class="number">513</span><span>: </span></span></li><li><span> doLeftPressed(x,y); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> </span><span class="number">514</span><span>: </span></span></li><li><span> doLeftReleased(x,y); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> </span><span class="number">516</span><span>: </span></span></li><li><span> doRightPressed(x,y); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> </span><span class="number">517</span><span>: </span></span></li><li><span> doRightReleased(x,y); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> </span><span class="number">519</span><span>: </span></span></li><li><span> doMiddlePressed(x,y); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> </span><span class="number">520</span><span>: </span></span></li><li><span> doMiddleReleased(x,y); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">default</span><span>: </span></span></li><li><span> } </span></li><li><span> } </span></li><li><span> </span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">abstract</span><span> </span><span class="keyword">void</span><span> doLeftPressed(</span><span class="keyword">int</span><span> x,</span><span class="keyword">int</span><span> y); </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">abstract</span><span> </span><span class="keyword">void</span><span> doLeftReleased(</span><span class="keyword">int</span><span> x,</span><span class="keyword">int</span><span> y); </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">abstract</span><span> </span><span class="keyword">void</span><span> doRightPressed(</span><span class="keyword">int</span><span> x,</span><span class="keyword">int</span><span> y); </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">abstract</span><span> </span><span class="keyword">void</span><span> doRightReleased(</span><span class="keyword">int</span><span> x,</span><span class="keyword">int</span><span> y); </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">abstract</span><span> </span><span class="keyword">void</span><span> doMiddlePressed(</span><span class="keyword">int</span><span> x,</span><span class="keyword">int</span><span> y); </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">abstract</span><span> </span><span class="keyword">void</span><span> doMiddleReleased(</span><span class="keyword">int</span><span> x,</span><span class="keyword">int</span><span> y); </span></span></li><li><span>} </span></li></ol></div><pre name="code" class="java" codeable\_id="457374" codeable\_type="Blog" source\_url="http://micheal19840929.iteye.com/blog/457374" pre\_index="1" title="Java语言的Hook实现" style="display: none;">import org.sf.feeling.swt.win32.extension.hook.data.HookData; import org.sf.feeling.swt.win32.extension.hook.data.MouseHookData; import org.sf.feeling.swt.win32.extension.hook.listener.HookEventListener;public abstract class MouseHookEventListener implements HookEventListener{
1public void acceptHookData(HookData hookData) { 2 int x=((MouseHookData) hookData).getPointX(); 3 int y=((MouseHookData) hookData).getPointY(); 4 switch(hookData.getWParam()) 5 { 6 case 513: 7 doLeftPressed(x,y); 8 break; 9 case 514: 10 doLeftReleased(x,y); 11 break; 12 case 516: 13 doRightPressed(x,y); 14 break; 15 case 517: 16 doRightReleased(x,y); 17 break; 18 case 519: 19 doMiddlePressed(x,y); 20 break; 21 case 520: 22 doMiddleReleased(x,y); 23 break; 24 default: 25 } 26} 27 28protected abstract void doLeftPressed(int x,int y); 29protected abstract void doLeftReleased(int x,int y); 30protected abstract void doRightPressed(int x,int y); 31protected abstract void doRightReleased(int x,int y); 32protected abstract void doMiddlePressed(int x,int y); 33protected abstract void doMiddleReleased(int x,int y);
}</pre>
<p> </p> <p>至此,我们的项目底层架构已经完成,下面就是业务流程的控制问题了,在贴上我的代码之前,我觉得有必要先做一下诛仙答题跟项目的介绍(又要废话了,顺便帮老池免费作下广告,遇上我是他的福分,^-^)。</p> <p>答题是这样的:首先,诛仙这个游戏是支持窗口化(且提供几个固定窗口大小供选择),而其中的答题窗口就是窗口中的窗口了(可拖动的)。7点,答题系统开启,每个玩家可选择进入答题窗口,等下一分钟才真正开始,这一分钟中,页面会显示出3个幸运星,但是没有题目........经过一番分析,可以确定用户要输入的有:当前使用的窗口大小及幸运星的位置(幸运星跟选项的位置不固定的,幸运星一确定,选项的位置也就知道了)。以下是关于这个业务的代码:</p> <p>定义一个特定的鼠标事件响应,如下:</p> <div class="dp-highlighter" id=""><div class="bar"><div class="tools">Java代码 <embed wmode="transparent" src="https://my.oschina.net/javascripts/syntaxhighlighter/clipboard\_new.swf" width="14" height="15" flashvars="clipboard=import%20java.awt.Dimension%3B%0Aimport%20java.util.LinkedList%3B%0Aimport%20java.util.List%3B%0A%0Apublic%20class%20MyMouseHookEventListener%20extends%20MouseHookEventListener%20%7B%0A%09private%20Dimension%20zeroDimension%3B%0A%09private%20List%3CDimension%3E%20dimensions%3Dnew%20LinkedList%3CDimension%3E()%3B%0A%09private%20boolean%20needFetchZeroDimension%3Dfalse%3B%0A%09private%20String%20currentOffsetSeries%3D%22%22%3B%0A%09%0A%09public%20void%20resetZeroDimension()%0A%09%7B%0A%09%09this.needFetchZeroDimension%3Dtrue%3B%0A%09%7D%0A%09%0A%09public%20void%20resetDimensions(String%20dimensionSeries)%0A%09%7B%0A%09%09this.dimensions.clear()%3B%0A%09%09String%5B%5D%20dimStrs%3DdimensionSeries.split(%22%2C%22)%3B%0A%09%09for(int%20i%3D0%3BdimStrs!%3Dnull%26%26i%3CdimStrs.length%2F2%3Bi%2B%2B)%0A%09%09%7B%0A%09%09%09int%20width%3DInteger.parseInt(dimStrs%5Bi\*2%5D)%2B(int)zeroDimension.getWidth()%3B%0A%09%09%09int%20height%3DInteger.parseInt(dimStrs%5Bi\*2%2B1%5D)%2B(int)zeroDimension.getHeight()%3B%0A%09%09%09dimensions.add(new%20Dimension(width%2Cheight))%3B%0A%09%09%7D%0A%09%7D%0A%09%0A%09public%20String%20getDimensionSeries()%0A%09%7B%0A%09%09String%20dimSeries%3D%22%22%3B%0A%09%09for(Dimension%20dim%3Athis.dimensions)%0A%09%09%7B%0A%09%09%09dimSeries%3DdimSeries%2B%22%2C%22%2B(int)(dim.getWidth()-zeroDimension.getWidth())%2B%22%2C%22%2B(int)(dim.getHeight()-zeroDimension.getHeight())%3B%0A%09%09%7D%0A%09%09if(dimSeries.length()%3E0)%0A%09%09%7B%0A%09%09%09dimSeries%3DdimSeries.substring(1)%3B%0A%09%09%7D%0A%09%09return%20dimSeries%3B%0A%09%7D%0A%0A%09%40Override%0A%09protected%20void%20doLeftPressed(int%20x%2C%20int%20y)%20%7B%7D%0A%0A%09%40Override%0A%09protected%20void%20doLeftReleased(int%20x%2C%20int%20y)%20%7B%7D%0A%0A%09%40Override%0A%09protected%20void%20doMiddlePressed(int%20x%2C%20int%20y)%20%7B%7D%0A%0A%09%40Override%0A%09protected%20void%20doMiddleReleased(int%20x%2C%20int%20y)%20%7B%7D%0A%0A%09%40Override%0A%09protected%20void%20doRightPressed(int%20x%2C%20int%20y)%20%7B%0A%09%09if(this.needFetchZeroDimension)%0A%09%09%7B%0A%09%09%09this.zeroDimension%3Dnew%20Dimension(x%2Cy)%3B%0A%09%09%09resetDimensions(currentOffsetSeries)%3B%0A%09%09%09this.needFetchZeroDimension%3Dfalse%3B%0A%09%09%09System.out.println(%22%E5%B9%B8%E8%BF%90%E6%98%9F%E4%BD%8D%E7%BD%AE%E5%B7%B2%E8%8E%B7%E5%8F%96%EF%BC%8C%E5%85%B3%E9%97%AD%E9%87%8D%E7%BD%AE%E6%A8%A1%E5%BC%8F%EF%BC%8C%5Cr%5Cn%E7%8E%B0%E5%9C%A8%E4%BD%A0%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E5%B0%8F%E9%94%AE%E7%9B%98%E4%B8%8A%E7%9A%8412345%E6%9D%A5%E5%AE%9E%E7%8E%B0%E9%BC%A0%E6%A0%87%E4%BA%8B%E4%BB%B6%E6%A8%A1%E6%8B%9F%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%BD%A0%E9%9C%80%E8%A6%81%E9%87%8D%E6%96%B0%E9%80%89%E6%8B%A9%E8%AF%B7%E6%8C%89F11%22)%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%40Override%0A%09protected%20void%20doRightReleased(int%20x%2C%20int%20y)%20%7B%7D%0A%0A%09public%20void%20setCurrentOffsetSeries(String%20currentOffsetSeries)%20%7B%0A%09%09this.currentOffsetSeries%20%3D%20currentOffsetSeries%3B%0A%09%7D%0A%0A%09public%20List%3CDimension%3E%20getDimensions()%20%7B%0A%09%09return%20dimensions%3B%0A%09%7D%0A%09%0A%09%0A%0A%7D%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="javascript:void()" title="收藏这段代码" onclick="code\_favorites\_do\_favorite(this);return false;"><img class="star" src="https://my.oschina.net/images/icon\_star.png" alt="收藏代码"><img class="spinner" src="https://my.oschina.net/images/spinner.gif" style="display:none"></a></div></div><ol start="1" class="dp-j"><li><span><span class="keyword">import</span><span> java.awt.Dimension; </span></span></li><li><span><span class="keyword">import</span><span> java.util.LinkedList; </span></span></li><li><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li><span> </span></li><li><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MyMouseHookEventListener </span><span class="keyword">extends</span><span> MouseHookEventListener { </span></span></li><li><span> <span class="keyword">private</span><span> Dimension zeroDimension; </span></span></li><li><span> <span class="keyword">private</span><span> List<Dimension> dimensions=</span><span class="keyword">new</span><span> LinkedList<Dimension>(); </span></span></li><li><span> <span class="keyword">private</span><span> </span><span class="keyword">boolean</span><span> needFetchZeroDimension=</span><span class="keyword">false</span><span>; </span></span></li><li><span> <span class="keyword">private</span><span> String currentOffsetSeries=</span><span class="string">""</span><span>; </span></span></li><li><span> </span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> resetZeroDimension() </span></span></li><li><span> { </span></li><li><span> <span class="keyword">this</span><span>.needFetchZeroDimension=</span><span class="keyword">true</span><span>; </span></span></li><li><span> } </span></li><li><span> </span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> resetDimensions(String dimensionSeries) </span></span></li><li><span> { </span></li><li><span> <span class="keyword">this</span><span>.dimensions.clear(); </span></span></li><li><span> String\[\] dimStrs=dimensionSeries.split(<span class="string">","</span><span>); </span></span></li><li><span> <span class="keyword">for</span><span>(</span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;dimStrs!=</span><span class="keyword">null</span><span>&&i<dimStrs.length/</span><span class="number">2</span><span>;i++) </span></span></li><li><span> { </span></li><li><span> <span class="keyword">int</span><span> width=Integer.parseInt(dimStrs\[i\*</span><span class="number">2</span><span>\])+(</span><span class="keyword">int</span><span>)zeroDimension.getWidth(); </span></span></li><li><span> <span class="keyword">int</span><span> height=Integer.parseInt(dimStrs\[i\*</span><span class="number">2</span><span>+</span><span class="number">1</span><span>\])+(</span><span class="keyword">int</span><span>)zeroDimension.getHeight(); </span></span></li><li><span> dimensions.add(<span class="keyword">new</span><span> Dimension(width,height)); </span></span></li><li><span> } </span></li><li><span> } </span></li><li><span> </span></li><li><span> <span class="keyword">public</span><span> String getDimensionSeries() </span></span></li><li><span> { </span></li><li><span> String dimSeries=<span class="string">""</span><span>; </span></span></li><li><span> <span class="keyword">for</span><span>(Dimension dim:</span><span class="keyword">this</span><span>.dimensions) </span></span></li><li><span> { </span></li><li><span> dimSeries=dimSeries+<span class="string">","</span><span>+(</span><span class="keyword">int</span><span>)(dim.getWidth()-zeroDimension.getWidth())+</span><span class="string">","</span><span>+(</span><span class="keyword">int</span><span>)(dim.getHeight()-zeroDimension.getHeight()); </span></span></li><li><span> } </span></li><li><span> <span class="keyword">if</span><span>(dimSeries.length()></span><span class="number">0</span><span>) </span></span></li><li><span> { </span></li><li><span> dimSeries=dimSeries.substring(<span class="number">1</span><span>); </span></span></li><li><span> } </span></li><li><span> <span class="keyword">return</span><span> dimSeries; </span></span></li><li><span> } </span></li><li><span> </span></li><li><span> <span class="annotation">@Override</span><span> </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> doLeftPressed(</span><span class="keyword">int</span><span> x, </span><span class="keyword">int</span><span> y) {} </span></span></li><li><span> </span></li><li><span> <span class="annotation">@Override</span><span> </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> doLeftReleased(</span><span class="keyword">int</span><span> x, </span><span class="keyword">int</span><span> y) {} </span></span></li><li><span> </span></li><li><span> <span class="annotation">@Override</span><span> </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> doMiddlePressed(</span><span class="keyword">int</span><span> x, </span><span class="keyword">int</span><span> y) {} </span></span></li><li><span> </span></li><li><span> <span class="annotation">@Override</span><span> </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> doMiddleReleased(</span><span class="keyword">int</span><span> x, </span><span class="keyword">int</span><span> y) {} </span></span></li><li><span> </span></li><li><span> <span class="annotation">@Override</span><span> </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> doRightPressed(</span><span class="keyword">int</span><span> x, </span><span class="keyword">int</span><span> y) { </span></span></li><li><span> <span class="keyword">if</span><span>(</span><span class="keyword">this</span><span>.needFetchZeroDimension) </span></span></li><li><span> { </span></li><li><span> <span class="keyword">this</span><span>.zeroDimension=</span><span class="keyword">new</span><span> Dimension(x,y); </span></span></li><li><span> resetDimensions(currentOffsetSeries); </span></li><li><span> <span class="keyword">this</span><span>.needFetchZeroDimension=</span><span class="keyword">false</span><span>; </span></span></li><li><span> System.out.println(<span class="string">"幸运星位置已获取,关闭重置模式,\\r\\n现在你可以使用小键盘上的12345来实现鼠标事件模拟,如果你需要重新选择请按F11"</span><span>); </span></span></li><li><span> } </span></li><li><span> } </span></li><li><span> </span></li><li><span> <span class="annotation">@Override</span><span> </span></span></li><li><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> doRightReleased(</span><span class="keyword">int</span><span> x, </span><span class="keyword">int</span><span> y) {} </span></span></li><li><span> </span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setCurrentOffsetSeries(String currentOffsetSeries) { </span></span></li><li><span> <span class="keyword">this</span><span>.currentOffsetSeries = currentOffsetSeries; </span></span></li><li><span> } </span></li><li><span> </span></li><li><span> <span class="keyword">public</span><span> List<Dimension> getDimensions() { </span></span></li><li><span> <span class="keyword">return</span><span> dimensions; </span></span></li><li><span> } </span></li><li><span> </span></li><li><span> </span></li><li><span> </span></li><li><span>} </span></li></ol></div><pre name="code" class="java" codeable\_id="457374" codeable\_type="Blog" source\_url="http://micheal19840929.iteye.com/blog/457374" pre\_index="2" title="Java语言的Hook实现" style="display: none;">import java.awt.Dimension; import java.util.LinkedList; import java.util.List;public class MyMouseHookEventListener extends MouseHookEventListener { private Dimension zeroDimension; private List<Dimension> dimensions=new LinkedList<Dimension>(); private boolean needFetchZeroDimension=false; private String currentOffsetSeries="";
1public void resetZeroDimension() 2{ 3 this.needFetchZeroDimension=true; 4} 5 6public void resetDimensions(String dimensionSeries) 7{ 8 this.dimensions.clear(); 9 String[] dimStrs=dimensionSeries.split(","); 10 for(int i=0;dimStrs!=null&&i<dimStrs.length/2;i++) 11 { 12 int width=Integer.parseInt(dimStrs[i*2])+(int)zeroDimension.getWidth(); 13 int height=Integer.parseInt(dimStrs[i*2+1])+(int)zeroDimension.getHeight(); 14 dimensions.add(new Dimension(width,height)); 15 } 16} 17 18public String getDimensionSeries() 19{ 20 String dimSeries=""; 21 for(Dimension dim:this.dimensions) 22 { 23 dimSeries=dimSeries+","+(int)(dim.getWidth()-zeroDimension.getWidth())+","+(int)(dim.getHeight()-zeroDimension.getHeight()); 24 } 25 if(dimSeries.length()>0) 26 { 27 dimSeries=dimSeries.substring(1); 28 } 29 return dimSeries; 30} 31 32@Override 33protected void doLeftPressed(int x, int y) {} 34 35@Override 36protected void doLeftReleased(int x, int y) {} 37 38@Override 39protected void doMiddlePressed(int x, int y) {} 40 41@Override 42protected void doMiddleReleased(int x, int y) {} 43 44@Override 45protected void doRightPressed(int x, int y) { 46 if(this.needFetchZeroDimension) 47 { 48 this.zeroDimension=new Dimension(x,y); 49 resetDimensions(currentOffsetSeries); 50 this.needFetchZeroDimension=false; 51 System.out.println("幸运星位置已获取,关闭重置模式,\r\n现在你可以使用小键盘上的12345来实现鼠标事件模拟,如果你需要重新选择请按F11"); 52 } 53} 54 55@Override 56protected void doRightReleased(int x, int y) {} 57 58public void setCurrentOffsetSeries(String currentOffsetSeries) { 59 this.currentOffsetSeries = currentOffsetSeries; 60} 61 62public List<Dimension> getDimensions() { 63 return dimensions; 64}
} </pre>
<p> </p> <p>再定义一个运行类:</p> <div class="dp-highlighter" id=""><div class="bar"><div class="tools">Java代码 <embed wmode="transparent" src="https://my.oschina.net/javascripts/syntaxhighlighter/clipboard\_new.swf" width="14" height="15" flashvars="clipboard=import%20java.awt.AWTException%3B%0Aimport%20java.awt.Robot%3B%0Aimport%20java.awt.Toolkit%3B%0Aimport%20java.awt.datatransfer.Clipboard%3B%0Aimport%20java.awt.datatransfer.StringSelection%3B%0Aimport%20java.awt.datatransfer.Transferable%3B%0Aimport%20java.awt.event.InputEvent%3B%0A%0Aimport%20org.sf.feeling.swt.win32.extension.hook.Hook%3B%0A%0Apublic%20class%20ZhuXianSwifter%20%7B%0A%09%0A%09public%20static%20final%20int%20NUM\_1%3D97%3B%0A%09public%20static%20final%20int%20NUM\_2%3D98%3B%0A%09public%20static%20final%20int%20NUM\_3%3D99%3B%0A%09public%20static%20final%20int%20NUM\_4%3D100%3B%0A%09public%20static%20final%20int%20NUM\_5%3D101%3B%0A%09public%20static%20final%20int%20F\_11%3D122%3B%0A%09public%20static%20final%20int%20F\_12%3D123%3B%0A%09%0A%09private%20static%20final%20String%20OFFSET\_SERIES\_640\_480%3D%22-125%2C84%2C-125%2C107%2C-125%2C130%2C-125%2C152%2C44%2C0%2C20%2C0%2C0%2C0%22%3B%0A%09private%20static%20final%20String%20OFFSET\_SERIES\_800\_600%3D%22-156%2C105%2C-156%2C134%2C-156%2C163%2C-156%2C190%2C55%2C0%2C25%2C0%2C0%2C0%22%3B%0A%09private%20static%20final%20String%20OFFSET\_SERIES\_1024\_768%3D%22-200%2C138%2C-200%2C172%2C-200%2C211%2C-200%2C248%2C70%2C0%2C32%2C0%2C0%2C0%22%3B%0A%0A%09%2F\*\*%0A%09%20\*%20%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%EF%BC%9A%0A%09%20\*%201%E3%80%81%E5%90%AF%E5%8A%A8%E5%90%8E%E5%85%88%E9%80%89%E6%8B%A9%E6%89%80%E4%BD%BF%E7%94%A8%E7%9A%84%E5%88%86%E8%BE%A8%E7%8E%87%EF%BC%8C%E7%9B%AE%E5%89%8D%E5%8F%AA%E6%94%AF%E6%8C%81640\*480%2C800\*600%2C1024\*768%EF%BC%9B%0A%09%20\*%202%E3%80%81%E7%84%B6%E5%90%8E%E4%BD%BF%E7%94%A8%E9%BC%A0%E6%A0%87%E5%8F%B3%E9%94%AE%E7%82%B9%E5%87%BB%E4%B8%80%E4%B8%8B%E8%AF%95%E7%82%BC%E7%AD%94%E9%A2%98%E7%AA%97%E5%8F%A3%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%B8%E8%BF%90%E6%98%9F%E7%9A%84%E4%B8%AD%E5%BF%83%E7%82%B9%E5%8D%B3%E5%8F%AF%EF%BC%9B%0A%09%20\*%203%E3%80%81%E4%BD%BF%E7%94%A8%E5%B0%8F%E9%94%AE%E7%9B%98%E7%9A%841234%E9%80%89%E6%8B%A9%E7%AD%94%E6%A1%88%EF%BC%8C%E4%BD%BF%E7%94%A85%E7%82%B9%E6%98%9F%E6%98%9F(%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%BF%E7%94%A8%E5%AE%8C%E4%BC%9A%E8%87%AA%E5%8A%A8%E7%94%A8%E7%AC%AC%E4%BA%8C%E4%B8%AA)%2C%0A%09%20\*%204%E3%80%81%E5%8F%AA%E6%94%AF%E6%8C%81%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%A8%A1%E5%BC%8F%0A%09%20\*%205%E3%80%81F11%E4%B8%BA%E5%8F%96%E5%9D%90%E6%A0%87%E6%A8%A1%E5%BC%8F%EF%BC%8C%E6%8C%89F11%E5%BC%80%E5%A7%8B%EF%BC%8C%E5%86%8D%E6%AC%A1%E6%8C%89F11%E7%BB%93%E6%9D%9F%EF%BC%8C%E5%B9%B6%E5%B0%86%E9%9B%B6%E5%9D%90%E6%A0%87%E8%B7%9F%E4%B9%8B%E5%89%8D%E7%9A%84%E5%81%8F%E7%A7%BB%E5%9D%90%E6%A0%87%E5%A4%8D%E5%88%B6%E5%88%B0%E7%B3%BB%E7%BB%9F%E5%89%AA%E8%B4%B4%E6%9D%BF%0A%09%20\*%206%E3%80%81%E6%8C%89F12%E9%80%80%E5%87%BA%E7%A8%8B%E5%BA%8F%0A%09%20\*%20%40throws%20AWTException%20%0A%09%20\*%2F%0A%09public%20static%20void%20main(String%5B%5D%20args)%20throws%20AWTException%20%7B%0A%09%09%0A%09%09%2F\*%E6%B3%A8%E5%86%8C%E9%BC%A0%E6%A0%87Hook\*%2F%0A%09%09final%20MyMouseHookEventListener%20mouseListener%3Dnew%20MyMouseHookEventListener()%3B%0A%09%09Hook.MOUSE.addListener(mouseListener)%3B%0A%09%09Hook.MOUSE.install()%3B%0A%09%09%0A%09%09%2F\*%E7%B3%BB%E7%BB%9F%E5%89%AA%E8%B4%B4%E6%9D%BF\*%2F%0A%09%09final%20Clipboard%20systemClipboard%20%3D%20Toolkit.getDefaultToolkit().getSystemClipboard()%3B%20%0A%09%09%0A%09%09final%20Robot%20robot%3Dnew%20Robot()%3B%0A%09%09%0A%09%09%2F\*%E9%94%AE%E7%9B%98%E7%9B%91%E5%90%AC%E5%99%A8\*%2F%0A%09%09final%20KeyboardHookEventListener%20keyboardListener%3Dnew%20KeyboardHookEventListener()%7B%0A%09%09%09%0A%09%09%09private%20boolean%20haveChooseMode%3Dfalse%3B%0A%09%09%09private%20int%20count%3D0%3B%0A%0A%09%09%09%40Override%0A%09%09%09public%20void%20doPress(int%20keyNum)%20%7B%0A%09%09%09%09String%20mode%3D%22%22%3B%0A%09%09%09%09if(keyNum%3D%3DF\_12)%0A%09%09%09%09%7B%0A%09%09%09%09%09if(!mouseListener.getDimensionSeries().equals(%22%22))%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09System.out.println(%22%E5%86%85%E5%AE%B9%E5%B7%B2%E7%BB%8F%E5%A4%8D%E5%88%B6%E5%88%B0%E7%B3%BB%E7%BB%9F%E5%89%AA%E8%B4%B4%E6%9D%BF%22)%3B%0A%09%09%09%09%09%09Transferable%20text%20%3D%20new%20StringSelection(mouseListener.getDimensionSeries())%3B%0A%09%09%09%09%09%09systemClipboard.setContents(text%2Cnull)%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09System.out.println(%22------%E7%A8%8B%E5%BA%8F%E9%80%80%E5%87%BA------%22)%3B%0A%09%09%09%09%09System.exit(0)%3B%0A%09%09%09%09%7D%0A%09%09%09%09else%20if(keyNum%3D%3DF\_11)%0A%09%09%09%09%7B%0A%09%09%09%09%09haveChooseMode%3Dfalse%3B%0A%09%09%09%09%09count%3D0%3B%0A%09%09%09%09%09System.out.println(%22%E5%90%AF%E5%8A%A8%E9%87%8D%E7%BD%AE%E6%A8%A1%E5%BC%8F%22)%3B%0A%09%09%09%09%09printChooseMode()%3B%0A%09%09%09%09%7D%0A%09%09%09%09else%0A%09%09%09%09%7B%0A%09%09%09%09%09if(haveChooseMode%3D%3Dfalse)%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09switch(keyNum)%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09case%20NUM\_1%3A%0A%09%09%09%09%09%09%09mode%3D%22640\*480%22%3B%0A%09%09%09%09%09%09%09mouseListener.setCurrentOffsetSeries(OFFSET\_SERIES\_640\_480)%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09case%20NUM\_2%3A%0A%09%09%09%09%09%09%09mode%3D%22800\*600%22%3B%0A%09%09%09%09%09%09%09mouseListener.setCurrentOffsetSeries(OFFSET\_SERIES\_800\_600)%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09case%20NUM\_3%3A%0A%09%09%09%09%09%09%09mode%3D%221024\*768%22%3B%0A%09%09%09%09%09%09%09mouseListener.setCurrentOffsetSeries(OFFSET\_SERIES\_1024\_768)%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09default%3A%0A%09%09%09%09%09%09%09System.out.println(%22%E8%AF%B7%E9%87%8D%E6%96%B0%E9%80%89%E6%8B%A9%3A%22)%3B%0A%09%09%09%09%09%09%09printChooseMode()%3B%0A%09%09%09%09%09%09%09return%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09System.out.println(%22%E6%82%A8%E9%80%89%E6%8B%A9%E4%BA%86%22%2Bmode%2B%22%E5%88%86%E8%BE%A8%E7%8E%87%E6%A8%A1%E5%BC%8F%22)%3B%0A%09%09%09%09%09%09haveChooseMode%3Dtrue%3B%0A%09%09%09%09%09%09mouseListener.resetZeroDimension()%3B%0A%09%09%09%09%09%09printFetchZeroCoordinate()%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09else%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09switch%20(keyNum)%20%7B%0A%09%09%09%09%09%09case%20NUM\_1%3A%0A%09%09%09%09%09%09%09robot.mouseMove((int)mouseListener.getDimensions().get(0).getWidth()%2C(int)mouseListener.getDimensions().get(0).getHeight())%3B%0A%09%09%09%09%09%09%09robot.mousePress(InputEvent.BUTTON1\_MASK)%3B%0A%09%09%09%09%09%09%09robot.mouseRelease(InputEvent.BUTTON1\_MASK)%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09case%20NUM\_2%3A%0A%09%09%09%09%09%09%09robot.mouseMove((int)mouseListener.getDimensions().get(1).getWidth()%2C(int)mouseListener.getDimensions().get(1).getHeight())%3B%0A%09%09%09%09%09%09%09robot.mousePress(InputEvent.BUTTON1\_MASK)%3B%0A%09%09%09%09%09%09%09robot.mouseRelease(InputEvent.BUTTON1\_MASK)%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09case%20NUM\_3%3A%0A%09%09%09%09%09%09%09robot.mouseMove((int)mouseListener.getDimensions().get(2).getWidth()%2C(int)mouseListener.getDimensions().get(2).getHeight())%3B%0A%09%09%09%09%09%09%09robot.mousePress(InputEvent.BUTTON1\_MASK)%3B%0A%09%09%09%09%09%09%09robot.mouseRelease(InputEvent.BUTTON1\_MASK)%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09case%20NUM\_4%3A%0A%09%09%09%09%09%09%09robot.mouseMove((int)mouseListener.getDimensions().get(3).getWidth()%2C(int)mouseListener.getDimensions().get(3).getHeight())%3B%0A%09%09%09%09%09%09%09robot.mousePress(InputEvent.BUTTON1\_MASK)%3B%0A%09%09%09%09%09%09%09robot.mouseRelease(InputEvent.BUTTON1\_MASK)%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09case%20NUM\_5%3A%0A%09%09%09%09%09%09%09robot.mouseMove((int)mouseListener.getDimensions().get(4%2Bcount).getWidth()%2C(int)mouseListener.getDimensions().get(4%2Bcount).getHeight())%3B%0A%09%09%09%09%09%09%09robot.mousePress(InputEvent.BUTTON1\_MASK)%3B%0A%09%09%09%09%09%09%09robot.mouseRelease(InputEvent.BUTTON1\_MASK)%3B%0A%09%09%09%09%09%09%09count%2B%2B%3B%0A%09%09%09%09%09%09%09if(count%3D%3D3)%0A%09%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09%09count%3D0%3B%0A%09%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09default%3A%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%0A%09%09%09%40Override%0A%09%09%09public%20void%20doReleased(int%20keyNum)%20%7B%7D%0A%09%09%09%0A%09%09%7D%3B%0A%09%09%0A%09%09Hook.KEYBOARD.addListener(keyboardListener)%3B%0A%09%09Hook.KEYBOARD.install()%3B%20%2F%2F%20%E8%A8%BB%E5%86%8A%E4%BA%8B%E4%BB%B6%0A%09%09%0A%09%09printChooseMode()%3B%0A%0A%09%7D%0A%09%0A%09private%20static%20void%20printChooseMode()%0A%09%7B%0A%09%09System.out.println(%22%E8%AF%B7%E9%80%89%E6%8B%A9%E7%AA%97%E5%8F%A3%E5%A4%A7%E5%B0%8F%EF%BC%9A%22)%3B%0A%09%09System.out.println(%22NUM1%3A640\*480%22)%3B%0A%09%09System.out.println(%22NUM2%3A800\*600%22)%3B%0A%09%09System.out.println(%22NUM3%3A1024\*768%22)%3B%0A%09%7D%0A%09%0A%09private%20static%20void%20printFetchZeroCoordinate()%0A%09%7B%0A%09%09System.out.println(%22%E8%AF%B7%E5%9C%A8%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%B8%E8%BF%90%E6%98%9F%E7%9A%84%E4%B8%AD%E5%BF%83%E4%B8%8A%E7%82%B9%E5%87%BB%E9%BC%A0%E6%A0%87%E5%8F%B3%E9%94%AE%22)%3B%0A%09%7D%0A%0A%7D" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="javascript:void()" title="收藏这段代码" onclick="code\_favorites\_do\_favorite(this);return false;"><img class="star" src="https://my.oschina.net/images/icon\_star.png" alt="收藏代码"><img class="spinner" src="https://my.oschina.net/images/spinner.gif" style="display:none"></a></div></div><ol start="1" class="dp-j"><li><span><span class="keyword">import</span><span> java.awt.AWTException; </span></span></li><li><span><span class="keyword">import</span><span> java.awt.Robot; </span></span></li><li><span><span class="keyword">import</span><span> java.awt.Toolkit; </span></span></li><li><span><span class="keyword">import</span><span> java.awt.datatransfer.Clipboard; </span></span></li><li><span><span class="keyword">import</span><span> java.awt.datatransfer.StringSelection; </span></span></li><li><span><span class="keyword">import</span><span> java.awt.datatransfer.Transferable; </span></span></li><li><span><span class="keyword">import</span><span> java.awt.event.InputEvent; </span></span></li><li><span> </span></li><li><span><span class="keyword">import</span><span> org.sf.feeling.swt.win32.extension.hook.Hook; </span></span></li><li><span> </span></li><li><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> ZhuXianSwifter { </span></span></li><li><span> </span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">int</span><span> NUM\_1=</span><span class="number">97</span><span>; </span></span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">int</span><span> NUM\_2=</span><span class="number">98</span><span>; </span></span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">int</span><span> NUM\_3=</span><span class="number">99</span><span>; </span></span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">int</span><span> NUM\_4=</span><span class="number">100</span><span>; </span></span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">int</span><span> NUM\_5=</span><span class="number">101</span><span>; </span></span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">int</span><span> F\_11=</span><span class="number">122</span><span>; </span></span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">int</span><span> F\_12=</span><span class="number">123</span><span>; </span></span></li><li><span> </span></li><li><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> String OFFSET\_SERIES\_640\_480=</span><span class="string">"-125,84,-125,107,-125,130,-125,152,44,0,20,0,0,0"</span><span>; </span></span></li><li><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> String OFFSET\_SERIES\_800\_600=</span><span class="string">"-156,105,-156,134,-156,163,-156,190,55,0,25,0,0,0"</span><span>; </span></span></li><li><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> String OFFSET\_SERIES\_1024\_768=</span><span class="string">"-200,138,-200,172,-200,211,-200,248,70,0,32,0,0,0"</span><span>; </span></span></li><li><span> </span></li><li><span> <span class="comment">/\*\*</span> </span></li><li><span><span class="comment"> \* 使用说明:</span> </span></li><li><span><span class="comment"> \* 1、启动后先选择所使用的分辨率,目前只支持640\*480,800\*600,1024\*768;</span> </span></li><li><span><span class="comment"> \* 2、然后使用鼠标右键点击一下试炼答题窗口的第一个幸运星的中心点即可;</span> </span></li><li><span><span class="comment"> \* 3、使用小键盘的1234选择答案,使用5点星星(第一个使用完会自动用第二个),</span> </span></li><li><span><span class="comment"> \* 4、只支持命令行模式</span> </span></li><li><span><span class="comment"> \* 5、F11为取坐标模式,按F11开始,再次按F11结束,并将零坐标跟之前的偏移坐标复制到系统剪贴板</span> </span></li><li><span><span class="comment"> \* 6、按F12退出程序</span> </span></li><li><span><span class="comment"> \* @throws AWTException </span> </span></li><li><span><span class="comment"> \*/</span><span> </span></span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String\[\] args) </span><span class="keyword">throws</span><span> AWTException { </span></span></li><li><span> </span></li><li><span> <span class="comment">/\*注册鼠标Hook\*/</span><span> </span></span></li><li><span> <span class="keyword">final</span><span> MyMouseHookEventListener mouseListener=</span><span class="keyword">new</span><span> MyMouseHookEventListener(); </span></span></li><li><span> Hook.MOUSE.addListener(mouseListener); </span></li><li><span> Hook.MOUSE.install(); </span></li><li><span> </span></li><li><span> <span class="comment">/\*系统剪贴板\*/</span><span> </span></span></li><li><span> <span class="keyword">final</span><span> Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); </span></span></li><li><span> </span></li><li><span> <span class="keyword">final</span><span> Robot robot=</span><span class="keyword">new</span><span> Robot(); </span></span></li><li><span> </span></li><li><span> <span class="comment">/\*键盘监听器\*/</span><span> </span></span></li><li><span> <span class="keyword">final</span><span> KeyboardHookEventListener keyboardListener=</span><span class="keyword">new</span><span> KeyboardHookEventListener(){ </span></span></li><li><span> </span></li><li><span> <span class="keyword">private</span><span> </span><span class="keyword">boolean</span><span> haveChooseMode=</span><span class="keyword">false</span><span>; </span></span></li><li><span> <span class="keyword">private</span><span> </span><span class="keyword">int</span><span> count=</span><span class="number">0</span><span>; </span></span></li><li><span> </span></li><li><span> <span class="annotation">@Override</span><span> </span></span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> doPress(</span><span class="keyword">int</span><span> keyNum) { </span></span></li><li><span> String mode=<span class="string">""</span><span>; </span></span></li><li><span> <span class="keyword">if</span><span>(keyNum==F\_12) </span></span></li><li><span> { </span></li><li><span> <span class="keyword">if</span><span>(!mouseListener.getDimensionSeries().equals(</span><span class="string">""</span><span>)) </span></span></li><li><span> { </span></li><li><span> System.out.println(<span class="string">"内容已经复制到系统剪贴板"</span><span>); </span></span></li><li><span> Transferable text = <span class="keyword">new</span><span> StringSelection(mouseListener.getDimensionSeries()); </span></span></li><li><span> systemClipboard.setContents(text,<span class="keyword">null</span><span>); </span></span></li><li><span> } </span></li><li><span> System.out.println(<span class="string">"------程序退出------"</span><span>); </span></span></li><li><span> System.exit(<span class="number">0</span><span>); </span></span></li><li><span> } </span></li><li><span> <span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(keyNum==F\_11) </span></span></li><li><span> { </span></li><li><span> haveChooseMode=<span class="keyword">false</span><span>; </span></span></li><li><span> count=<span class="number">0</span><span>; </span></span></li><li><span> System.out.println(<span class="string">"启动重置模式"</span><span>); </span></span></li><li><span> printChooseMode(); </span></li><li><span> } </span></li><li><span> <span class="keyword">else</span><span> </span></span></li><li><span> { </span></li><li><span> <span class="keyword">if</span><span>(haveChooseMode==</span><span class="keyword">false</span><span>) </span></span></li><li><span> { </span></li><li><span> <span class="keyword">switch</span><span>(keyNum) </span></span></li><li><span> { </span></li><li><span> <span class="keyword">case</span><span> NUM\_1: </span></span></li><li><span> mode=<span class="string">"640\*480"</span><span>; </span></span></li><li><span> mouseListener.setCurrentOffsetSeries(OFFSET\_SERIES\_640\_480); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> NUM\_2: </span></span></li><li><span> mode=<span class="string">"800\*600"</span><span>; </span></span></li><li><span> mouseListener.setCurrentOffsetSeries(OFFSET\_SERIES\_800\_600); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> NUM\_3: </span></span></li><li><span> mode=<span class="string">"1024\*768"</span><span>; </span></span></li><li><span> mouseListener.setCurrentOffsetSeries(OFFSET\_SERIES\_1024\_768); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">default</span><span>: </span></span></li><li><span> System.out.println(<span class="string">"请重新选择:"</span><span>); </span></span></li><li><span> printChooseMode(); </span></li><li><span> <span class="keyword">return</span><span>; </span></span></li><li><span> } </span></li><li><span> System.out.println(<span class="string">"您选择了"</span><span>+mode+</span><span class="string">"分辨率模式"</span><span>); </span></span></li><li><span> haveChooseMode=<span class="keyword">true</span><span>; </span></span></li><li><span> mouseListener.resetZeroDimension(); </span></li><li><span> printFetchZeroCoordinate(); </span></li><li><span> } </span></li><li><span> <span class="keyword">else</span><span> </span></span></li><li><span> { </span></li><li><span> <span class="keyword">switch</span><span> (keyNum) { </span></span></li><li><span> <span class="keyword">case</span><span> NUM\_1: </span></span></li><li><span> robot.mouseMove((<span class="keyword">int</span><span>)mouseListener.getDimensions().get(</span><span class="number">0</span><span>).getWidth(),(</span><span class="keyword">int</span><span>)mouseListener.getDimensions().get(</span><span class="number">0</span><span>).getHeight()); </span></span></li><li><span> robot.mousePress(InputEvent.BUTTON1\_MASK); </span></li><li><span> robot.mouseRelease(InputEvent.BUTTON1\_MASK); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> NUM\_2: </span></span></li><li><span> robot.mouseMove((<span class="keyword">int</span><span>)mouseListener.getDimensions().get(</span><span class="number">1</span><span>).getWidth(),(</span><span class="keyword">int</span><span>)mouseListener.getDimensions().get(</span><span class="number">1</span><span>).getHeight()); </span></span></li><li><span> robot.mousePress(InputEvent.BUTTON1\_MASK); </span></li><li><span> robot.mouseRelease(InputEvent.BUTTON1\_MASK); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> NUM\_3: </span></span></li><li><span> robot.mouseMove((<span class="keyword">int</span><span>)mouseListener.getDimensions().get(</span><span class="number">2</span><span>).getWidth(),(</span><span class="keyword">int</span><span>)mouseListener.getDimensions().get(</span><span class="number">2</span><span>).getHeight()); </span></span></li><li><span> robot.mousePress(InputEvent.BUTTON1\_MASK); </span></li><li><span> robot.mouseRelease(InputEvent.BUTTON1\_MASK); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> NUM\_4: </span></span></li><li><span> robot.mouseMove((<span class="keyword">int</span><span>)mouseListener.getDimensions().get(</span><span class="number">3</span><span>).getWidth(),(</span><span class="keyword">int</span><span>)mouseListener.getDimensions().get(</span><span class="number">3</span><span>).getHeight()); </span></span></li><li><span> robot.mousePress(InputEvent.BUTTON1\_MASK); </span></li><li><span> robot.mouseRelease(InputEvent.BUTTON1\_MASK); </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">case</span><span> NUM\_5: </span></span></li><li><span> robot.mouseMove((<span class="keyword">int</span><span>)mouseListener.getDimensions().get(</span><span class="number">4</span><span>+count).getWidth(),(</span><span class="keyword">int</span><span>)mouseListener.getDimensions().get(</span><span class="number">4</span><span>+count).getHeight()); </span></span></li><li><span> robot.mousePress(InputEvent.BUTTON1\_MASK); </span></li><li><span> robot.mouseRelease(InputEvent.BUTTON1\_MASK); </span></li><li><span> count++; </span></li><li><span> <span class="keyword">if</span><span>(count==</span><span class="number">3</span><span>) </span></span></li><li><span> { </span></li><li><span> count=<span class="number">0</span><span>; </span></span></li><li><span> } </span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> <span class="keyword">default</span><span>: </span></span></li><li><span> <span class="keyword">break</span><span>; </span></span></li><li><span> } </span></li><li><span> } </span></li><li><span> } </span></li><li><span> } </span></li><li><span> </span></li><li><span> <span class="annotation">@Override</span><span> </span></span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> doReleased(</span><span class="keyword">int</span><span> keyNum) {} </span></span></li><li><span> </span></li><li><span> }; </span></li><li><span> </span></li><li><span> Hook.KEYBOARD.addListener(keyboardListener); </span></li><li><span> Hook.KEYBOARD.install(); <span class="comment">// 註冊事件</span><span> </span></span></li><li><span> </span></li><li><span> printChooseMode(); </span></li><li><span> </span></li><li><span> } </span></li><li><span> </span></li><li><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> printChooseMode() </span></span></li><li><span> { </span></li><li><span> System.out.println(<span class="string">"请选择窗口大小:"</span><span>); </span></span></li><li><span> System.out.println(<span class="string">"NUM1:640\*480"</span><span>); </span></span></li><li><span> System.out.println(<span class="string">"NUM2:800\*600"</span><span>); </span></span></li><li><span> System.out.println(<span class="string">"NUM3:1024\*768"</span><span>); </span></span></li><li><span> } </span></li><li><span> </span></li><li><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> printFetchZeroCoordinate() </span></span></li><li><span> { </span></li><li><span> System.out.println(<span class="string">"请在第一个幸运星的中心上点击鼠标右键"</span><span>); </span></span></li><li><span> } </span></li><li><span> </span></li><li><span>} </span></li></ol></div><pre name="code" class="java" codeable\_id="457374" codeable\_type="Blog" source\_url="http://micheal19840929.iteye.com/blog/457374" pre\_index="3" title="Java语言的Hook实现" style="display: none;">import java.awt.AWTException; import java.awt.Robot; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.event.InputEvent;import org.sf.feeling.swt.win32.extension.hook.Hook;
public class ZhuXianSwifter {
1public static final int NUM_1=97; 2public static final int NUM_2=98; 3public static final int NUM_3=99; 4public static final int NUM_4=100; 5public static final int NUM_5=101; 6public static final int F_11=122; 7public static final int F_12=123; 8 9private static final String OFFSET_SERIES_640_480="-125,84,-125,107,-125,130,-125,152,44,0,20,0,0,0"; 10private static final String OFFSET_SERIES_800_600="-156,105,-156,134,-156,163,-156,190,55,0,25,0,0,0"; 11private static final String OFFSET_SERIES_1024_768="-200,138,-200,172,-200,211,-200,248,70,0,32,0,0,0"; 12 13/** 14 * 使用说明: 15 * 1、启动后先选择所使用的分辨率,目前只支持640*480,800*600,1024*768; 16 * 2、然后使用鼠标右键点击一下试炼答题窗口的第一个幸运星的中心点即可; 17 * 3、使用小键盘的1234选择答案,使用5点星星(第一个使用完会自动用第二个), 18 * 4、只支持命令行模式 19 * 5、F11为取坐标模式,按F11开始,再次按F11结束,并将零坐标跟之前的偏移坐标复制到系统剪贴板 20 * 6、按F12退出程序 21 * @throws AWTException 22 */ 23public static void main(String[] args) throws AWTException { 24 25 /*注册鼠标Hook*/ 26 final MyMouseHookEventListener mouseListener=new MyMouseHookEventListener(); 27 Hook.MOUSE.addListener(mouseListener); 28 Hook.MOUSE.install(); 29 30 /*系统剪贴板*/ 31 final Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 32 33 final Robot robot=new Robot(); 34 35 /*键盘监听器*/ 36 final KeyboardHookEventListener keyboardListener=new KeyboardHookEventListener(){ 37 38 private boolean haveChooseMode=false; 39 private int count=0; 40 41 @Override 42 public void doPress(int keyNum) { 43 String mode=""; 44 if(keyNum==F_12) 45 { 46 if(!mouseListener.getDimensionSeries().equals("")) 47 { 48 System.out.println("内容已经复制到系统剪贴板"); 49 Transferable text = new StringSelection(mouseListener.getDimensionSeries()); 50 systemClipboard.setContents(text,null); 51 } 52 System.out.println("------程序退出------"); 53 System.exit(0); 54 } 55 else if(keyNum==F_11) 56 { 57 haveChooseMode=false; 58 count=0; 59 System.out.println("启动重置模式"); 60 printChooseMode(); 61 } 62 else 63 { 64 if(haveChooseMode==false) 65 { 66 switch(keyNum) 67 { 68 case NUM_1: 69 mode="640*480"; 70 mouseListener.setCurrentOffsetSeries(OFFSET_SERIES_640_480); 71 break; 72 case NUM_2: 73 mode="800*600"; 74 mouseListener.setCurrentOffsetSeries(OFFSET_SERIES_800_600); 75 break; 76 case NUM_3: 77 mode="1024*768"; 78 mouseListener.setCurrentOffsetSeries(OFFSET_SERIES_1024_768); 79 break; 80 default: 81 System.out.println("请重新选择:"); 82 printChooseMode(); 83 return; 84 } 85 System.out.println("您选择了"+mode+"分辨率模式"); 86 haveChooseMode=true; 87 mouseListener.resetZeroDimension(); 88 printFetchZeroCoordinate(); 89 } 90 else 91 { 92 switch (keyNum) { 93 case NUM_1: 94 robot.mouseMove((int)mouseListener.getDimensions().get(0).getWidth(),(int)mouseListener.getDimensions().get(0).getHeight()); 95 robot.mousePress(InputEvent.BUTTON1_MASK); 96 robot.mouseRelease(InputEvent.BUTTON1_MASK); 97 break; 98 case NUM_2: 99 robot.mouseMove((int)mouseListener.getDimensions().get(1).getWidth(),(int)mouseListener.getDimensions().get(1).getHeight()); 100 robot.mousePress(InputEvent.BUTTON1_MASK); 101 robot.mouseRelease(InputEvent.BUTTON1_MASK); 102 break; 103 case NUM_3: 104 robot.mouseMove((int)mouseListener.getDimensions().get(2).getWidth(),(int)mouseListener.getDimensions().get(2).getHeight()); 105 robot.mousePress(InputEvent.BUTTON1_MASK); 106 robot.mouseRelease(InputEvent.BUTTON1_MASK); 107 break; 108 case NUM_4: 109 robot.mouseMove((int)mouseListener.getDimensions().get(3).getWidth(),(int)mouseListener.getDimensions().get(3).getHeight()); 110 robot.mousePress(InputEvent.BUTTON1_MASK); 111 robot.mouseRelease(InputEvent.BUTTON1_MASK); 112 break; 113 case NUM_5: 114 robot.mouseMove((int)mouseListener.getDimensions().get(4+count).getWidth(),(int)mouseListener.getDimensions().get(4+count).getHeight()); 115 robot.mousePress(InputEvent.BUTTON1_MASK); 116 robot.mouseRelease(InputEvent.BUTTON1_MASK); 117 count++; 118 if(count==3) 119 { 120 count=0; 121 } 122 break; 123 default: 124 break; 125 } 126 } 127 } 128 } 129 130 @Override 131 public void doReleased(int keyNum) {} 132 133 }; 134 135 Hook.KEYBOARD.addListener(keyboardListener); 136 Hook.KEYBOARD.install(); // 註冊事件 137 138 printChooseMode(); 139 140} 141 142private static void printChooseMode() 143{ 144 System.out.println("请选择窗口大小:"); 145 System.out.println("NUM1:640*480"); 146 System.out.println("NUM2:800*600"); 147 System.out.println("NUM3:1024*768"); 148} 149 150private static void printFetchZeroCoordinate() 151{ 152 System.out.println("请在第一个幸运星的中心上点击鼠标右键"); 153}
}</pre>
<p> </p> <p>以上就是本项目的所以代码,运行时要先按小键盘的1/2/3选择使用的窗口大小,然后在第一个幸运星的中心点击下右键鼠标就可以了,之后你就可以用小键盘的1/2/3/4/5(5是幸运星)来选择你的答案了。</p> </div>