C#_CF玩瞬时给你一个点--cross

其实这个程序很简单,我只是想在屏幕的正中央弄一个很小的点,作为玩CF那个准星,因为CF的狙击在不开镜的情况下是没有准星的(额……这个不算是挂吧^_^)。

刚开始的时候,我的思路是弄一个图片,就是一个点的图片,很小,放在正中央,然后把他始终放保持最前端就OK了。

我在窗体属性里把窗体位置改为屏幕居中,大小设为(5,5),运行,结果窗体的大小很大,具体不知道,好像最小值有限制,然后我就纠结了……于是我想到在里面放一个picture控件,然后把主窗体给弄透明了,然后再搞个鼠标穿透……步骤很简单,主要是把窗体弄透明,于是乎在网上找到了这么一句代码:

this.TransparencyKey = this.BackColor;//放在load事件里。

神奇的事情发生了,不仅窗体背景透明,而且直接就实现了鼠标穿透(picture控件没有穿透),太好了。然后就是保持最前的代码,很轻松的从网上找到了一句:

this.TopMost = true;//也放到load事件里。

一切是那么美好,我觉得这个小小的程序就完工了。

先打开cross,再打开CF开始测试,刚开始登录正常,选择大区正常,可是到了进入游戏就完蛋了……CF会将电脑分辨率自动改为800×600,蛋疼了,本来看着在屏幕中央的点瞬间转移到了右下角…………程序在运行以后不会自动检测分辨率的改变和自动改变点的位置…………然后疯狂的想方法……先用最笨的两个(非技术):

(1)在CF运行前将电脑分辨率手动改为800×600,然后运行cross,点在中间,然后CF打开,进入游戏……完美…………

(2)在CF后,把CF切出来(用alt+tab),然后运行cross,这样就可以不用手动该分辨率了……但是诞生了一个问题,这时的cross不再最前端了,被CF给盖住了。

相当纠结,CF好像在切出去,再切回来的时候会自动保持最前,这样cross就不起作用了,不过嘛,淡定。来个定时器,十秒钟设置一次最前端(心里窃喜)。OK,拖个timer控件,然后在Load事件里:

this.timer1.Interval = 10000;//设置间隔时间
        this.timer1.Start();
//开始定时器

然后就双击timer控件,添加,this.TopMost = true;-----------完美解决!

但是吧……这两种解决方法对于我们技术人员来说太白痴了……要做就做个高档的,自动根据系统分辨率改变点的位置(^_^)

思路就是:利用刚刚的定时器,十秒检测一下系统分辨率,然后重启程序就OK,于是乎……百度中……………………………………

郁闷的是,分辨率的获取没有直接的方法,不过有直接的方法是获取系统桌面的大小,也OK,只要能检测到桌面的大小改变就行,首先定义一个变量:

private Rectangle rect = new Rectangle();

然后在Load里记录下运行时的大小:

rect = Screen.GetWorkingArea(this);//获取当前屏幕的大小储存到rect里。


 if(rect!=Screen.GetWorkingArea(this))//将当前屏幕大小与rect里比较,如果不相等,执行下面代码
            {
                Application.Restart();//程序重启
                rect = Screen.GetWorkingArea(this);//将新的屏幕大小放到rect里
          }

打开cross,打开CF,真是太完美了,程序保持最前端。选择服务器选择频道,选择房间,拎着狙击开始火拼(心里那叫一个美!!!),一开镜,我笑了……点的位置竟然比狙击的准星查了N多,在狙击准星的上方……这究竟是为什么捏…………心里那叫一个乱啊……突然,想到了刚刚找获取系统分辨率方法的时候注意到,貌似,系统默认屏幕大小是不算任务栏的,就是程序的中央其实就是出去任务栏剩下大小的中央,而CF是全屏,无所谓任务栏……我里个去………………蛋疼无比啊…………

这个程序做了那么久,实在是…………于是乎就想到了偷懒…………手动更改picture控件的位置,然后到达使他在中央的目的……于是乎,不断的进出CF,不断的调节picture控件的位置,真是的蛋疼无比……最后终于成功了!!!!但是出现了一个前所未有的问题,当我把那个点放到屏幕中间后,进入CF游戏,一个鼠标在那个点上停留……只要点击鼠标的任意一个键,系统就将焦点给cross,CF就切出来了……晕死………………原来CF一直是吧鼠标放在屏幕中央,然后隐藏图标……太阴险了!!!!!我无奈的想起了鼠标穿透,我之前一直不想用鼠标穿透是因为他要调用Windows API,不是用.net库。我不是很理解,所以就不想用,不过现在,只能复制粘贴了……唉……

  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")]
        private static extern int SetLayeredWindowAttributes(
        IntPtr hwnd,
        int crKey,
        int bAlpha,
        int dwFlags
        );
        
        /// <summary>
        /// 使窗口有鼠标穿透功能
        /// </summary>
        public void CanPenetrate()
        {
            uint intExTemp = GetWindowLong(this.Handle, GWL_EXSTYLE);
            uint oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);
            SetLayeredWindowAttributes(this.Handle, 0, 200, LWA_ALPHA);
        }

然后在Load里调用CanPenetrate();

接下来的出现的一幕让我很是无奈,窗体和控件都实现了鼠标穿透,可是………………窗体的透明消失了…………尴尬………………点点后面一大块白色的背景!!!

我把this.TransparencyKey = this.BackColor;放在CanPenetrate()后,结果穿透效果消失,我把穿透代码放前面,而透明效果消失……纠结…………想了下,也许两个代码都是用来设置窗体显示效果的,不能重叠,只能显示一个……!@#¥%……&唉……让我情何以堪啊……做了这么久…………

不行,不能放弃,于是乎就想解决刚刚的问题,就是窗体大小的最小值问题,哈哈,功夫不负有心人,被我找到了,只需要在Load里加:

Size newSize = new Size(5, 5);
            this.MaximumSize = this.MinimumSize = newSize;
      this.Size = newSize;

成功!删除picture控件,将窗体背景颜色改成自己喜欢的颜色,然后就可以把窗体透明的代码去掉了…………

打开cross,打开CF,选择服务器,频道,进入游戏,抱着狙击,开镜!顿时间内牛满面………………我一晚上的努力终于没有白费……!!!!!

额……最后想了下………这个软件够白痴的,几乎用不到,除非是玩瞬……但是呢……俺学到了不少知识呢,太高兴了,胡哈哈哈哈哈!!!!







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值