本猿前段时间看见QQ空间有打豆豆这款小游戏,就玩了玩,感觉还不错,就是总是打不准,尤其是要碰撞1次甚至2次的,于是就下定决心,自己写个瞄准程序。
效果图:
当由于本猿是做asp.net 的,在学校时也学过c# winform,不过都是各种信息管理方面的,对于c# windows 编程,win32,这种涉及到比较底层的东西,一直未曾接触过。这次看来要点点的来了。空闲时就在网上找资料,相关demo,最后终于大功告成。欢迎各位多提意见,比如说程序性能优化,功能优化。在这里就不做代码展示解读了,源码中有较详细的注释。
源码地址:3366打豆豆瞄准线.rar
Exe免积分下载:开心泡泡猫瞄准线and3366打豆豆瞄准线Exe.rar
另外:将此程序改改就可以做成开心泡泡猫的瞄准线了。泡泡猫瞄准线效果图:
重大Bug:在windows 2003,XP 下无鼠标穿透功能,目前仅限于win7。
窗体透明鼠标穿透功能是靠Form.TransparencyKey属性实现的。根据MSDN上的解释:当将 Color 分配给 TransparencyKey 属性时,具有相同 BackColor 的窗体区域将透明显示。在窗体的透明区域执行的任何鼠标操作(如鼠标单击)都将传输到该透明区域下的窗口。例如,如果使窗体的工作区透明,则在该区域上单击鼠标会将单击的事件通知发送到该区域下的任何窗口。如果分配给TransparencyKey 属性的颜色与窗体上的任何控件相同,则这些控件也将透明显示。BackColor是支持的,但是BackgroundImage却没有说明,实践发现,在Win7下能实现,而在之前的系统中,仅有透明而无穿透。
还有另外一种途径实现穿透,但是在透明效果上要大打折扣。采用网上常用的鼠标穿透代码,再把穿透透明度进行调整:
#region 鼠标穿透
private const uint WS_EX_LAYERED = 0x80000;
private const int WS_EX_TRANSPARENT = 0x20;
private const int GWL_STYLE = (-16);
private const int GWL_EXSTYLE = (-20);
private const int LWA_ALPHA = 0x2;
[DllImport("user32", EntryPoint = "SetWindowLong")]
private static extern uint SetWindowLong(
IntPtr hwnd,
int nIndex,
uint dwNewLong
);
[DllImport("user32", EntryPoint = "GetWindowLong")]
private static extern uint GetWindowLong(
IntPtr hwnd,
int nIndex
);
[DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]
//bAlpha是不透明度,取值范围是(0,255),其中0代表全透明,255代表不透明。
private static extern int SetLayeredWindowAttributes(
IntPtr hwnd,
int crKey,
int bAlpha,
int dwFlags
);
/// <summary>
/// 使窗口有鼠标穿透功能
/// </summary>
public void CanPenetrate(int bAlpha)
{
uint intExTemp = GetWindowLong(this.Handle, GWL_EXSTYLE);
uint oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);
SetLayeredWindowAttributes(this.Handle, 0, bAlpha, LWA_ALPHA);
}
#endregion
CanPenetrate(50);
这样子的话,整个窗体都被穿透了,所有按钮,标题栏都不能操作了,而且在视觉效果上懵懵懂懂的,看起来很不爽。
源码中未提供泡泡猫源码。该篇文章,源码随时更新。。。