让你用.Net来打微信跳一超过

其他

如前所述,还生另外一些方,例如使用WPF,使用anchoring/docking等,这是一个重复明白之选料。
如果表单上有数千独控件,则恐会见逢加载延迟。
然而,这点延迟对现行运作高效的处理器吧不成问题。
这种方法才是在表单的加载时才实施同样次于调用操作,因此不会见带致命的属性降低之题目。

View Code

技术

实际没什么技术可言,只是用了一个聊技巧。我们用简单只常量来保存设计时的屏幕分辨率,我们叫设计时分辨率。这样,无论何时运行应用程序,它还见面博得一个乘法因子,这实在是一个比重因子,通过以手上分辨率除以设计时分辨率来得到该因子。
窗体的所有控件都于传送给这个看似对象进行缩放和调整大小。

即先后只能支持Android设备,IOS设备特写了接口,还不曾兑现
步骤:

代码

  • 安卓手机打开USB调试,设置》开发者选项》USB调试
  • 微机及手机USB线连接,确保实施adb devices可找到设备id

The Responsive Class – Responsive.cs

创办一个类Responsive.cs,添加5只变量。

float WIDTH_AT_DESIGN_TIME = (float)Convert.ToDouble
                             (ConfigurationManager.AppSettings["DESIGN_TIME_SCREEN_WIDTH"]);
float HEIGHT_AT_DESIGN_TIME = (float)Convert.ToDouble
                              (ConfigurationManager.AppSettings["DESIGN_TIME_SCREEN_HEIGHT"]);
Rectangle Resolution;
float WidthMultiplicationFactor;
float HeightMultiplicationFactor;

设计时屏幕分辨率保存在App.config文件被。

<add key ="DESIGN_TIME_SCREEN_WIDTH" value="1920"/>
<add key ="DESIGN_TIME_SCREEN_HEIGHT" value="1080"/>

当类的一个实例被创造时,当前之辨析为提供给构造函数。
之后调用该类的SetMultiplicationFactor()方法。
这种方式通过将手上分辨率除以设计时分辨率来抱缩放因子。

public Responsive(Rectangle ResolutionParam)
{
    Resolution = ResolutionParam;
}

public void SetMultiplicationFactor()
{
    WidthMultiplicationFactor = Resolution.Width / WIDTH_AT_DESIGN_TIME;
    HeightMultiplicationFactor = Resolution.Height / HEIGHT_AT_DESIGN_TIME;
}

比如说,该应用程序设计在1920×1080分辨率。
如果这应用程序在分辨率为1024×768之微机及运行,则WidthMultiplicationFactor和HeightMultiplicationFactor更改如下:

WidthMultiplicationFactor = 1024/1920 = 0.533
HeightMultiplicationFactor = 768/1080 = 0.711

末了来个别栽重载方法,它们为应用程序控件提供响应式解决方案(最佳大小,位置以及字体大小)的末尾方法。

public int GetMetrics(int ComponentValue)
{
    return (int)(Math.Floor(ComponentValue * WidthMultiplicationFactor));
}

public int GetMetrics(int ComponentValue, string Direction)
{
    if (Direction.Equals("Width") || Direction.Equals("Left"))
        return (int)(Math.Floor(ComponentValue * WidthMultiplicationFactor));
    else if (Direction.Equals("Height") || Direction.Equals("Top"))
        return (int)(Math.Floor(ComponentValue * HeightMultiplicationFactor));
    return 1;
}

如,如果在宽度=465,高度=72,左=366,顶部=41与字体大小=40的控件,则该办法返回建议之大小,位置及字体大小为:

Width = 465 * 0.533 = 248
Height = 72 * 0.711= 51
Left = 366 * 0.533= 195
Top = 41 * 0.711= 29
Font-size = 40 * 0.533 = 21

实则,这些措施返回缩放的控件与大小、位置和字体大小,而这些价值是展示的极端佳值。

5。然后我们透过像素分析,找到对象的终端
规律是:第一个点和继一个接触对比,看变化大小
苟转大小超过一个值。就以为是目标位了(跳一跨背景是潜移默化的)
此地是方块点。顶点就是一个碰。当如果目标吧圆体的早晚
这就是说顶度也会产生几乎个像从的Y轴都是一致的。那么我们如果把生几独一样之查找出来。取中位置,算为极端

引言

创响应式WinForm应用程序并无那么简单。
响应式布局,在此我指的凡应用程序在不同屏幕分辨率下之可用性。
对于WinForm应用程序,我们要明白地冲分辨率来调整控件的高低与重新定位。
虽然以采取WPF时有有关的尽以,通过下控件的docking和anchoring,或使用panels等措施,但本文提供了一致栽将响应式应用于WinForm应用程序的不比方式。

一半机关版本

使用 Responsive Class

俺们用的凡因任何要应的花样简单地开创是看似的靶子。
当前的分辨率是当构造函数中提供的, 之后的做事便是白手起家所用的乘法因子。

Responsive ResponsiveObj;
ResponsiveObj = new Responsive(Screen.PrimaryScreen.Bounds);
ResponsiveObj.SetMultiplicationFactor();

当当时下,表单的兼具控件都以依次个传递,以在表单的加载事件备受调整大小与重定位。
这个调用在脚的代码中就。 它所做的凡率先用窗体定位及屏幕的主导。
我在此地安装了一个校常数(30),为顶尖的直位置上加控件,这或许为开发人员而异。
之后,表单的各级一个控件都见面另行定位,调整大小,并更校准字体大小。

private void ResponsiveForm_Load(object sender, EventArgs e)
{
    Width = ResponsiveObj.GetMetrics(Width, "Width");           // Form width and height set up.
    Height = ResponsiveObj.GetMetrics(Height, "Height");
    Left = Screen.GetBounds(this).Width / 2 - Width / 2;        // Form centering.
    Top = Screen.GetBounds(this).Height / 2 - Height / 2 - 30;  // 30 is a calibration factor.

    foreach (Control Ctl in this.Controls)
    {
        Ctl.Font = new Font(FontFamily.GenericSansSerif, 
                   ResponsiveObj.GetMetrics((int)Ctl.Font.Size), FontStyle.Regular);
        Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
        Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
        Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
        Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
    }
}

 

示例

以下是一个非常简单的表单,其中富含一个data
gird,一个label,一个textbox和一个button。
下面的图形为三种不同之分辨率截取。
下面的截图是当1920×1080分辨率下截取的:

下的截图是在1360×768分辨率下截取的:

脚的截图是在1024×768分辨率下截取的:

其实,通过压缩/扩大和还定位控制到超级水准,Form在不同之分辨率下看起是均等的。

代码调整

就是比如我们对垂直中心定位所召开的那样,我们兴许得装有些参数来调整总体布局。

除此以外,建议开发者尝试以不同的分辨率查看表单的外观,以确认有的控件都是可见的,并遵循预期在屏幕上对定位。

而外,对于一个简易的表单,这是一个通用的方法,它若表单的有控件都怀有这些性—宽度,高度,左侧,顶部及字体大小。但是,真实情况并非如此。有一部分表单控件不具有所有这些性。例如,图片框没有font-size属性。因此,如果这么的状下没明显处理,运行代码用见面促成运行时充分。本文旨在介绍这种办法,开发人员需要依据实际状况进行校准。建议之措施如下:

private void ResponsiveForm_Load(object sender, EventArgs e)
{
    Width = ResponsiveObj.GetMetrics(Width, "Width");           // Form width and height set up.
    Height = ResponsiveObj.GetMetrics(Height, "Height");
    Left = Screen.GetBounds(this).Width / 2 - Width / 2;        // Form centering.
    Top = Screen.GetBounds(this).Height / 2 - Height / 2 - 30;  // 30 is a calibration factor.

    foreach (Control Ctl in this.Controls)
    {
        if (Ctl is PictureBox)
        {
            Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
            Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
            Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
            Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
        }
        else
        {
            Ctl.Font = new Font(FontFamily.GenericSansSerif, 
                                ResponsiveObj.GetMetrics((int)Ctl.Font.Size), FontStyle.Regular);
            Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
            Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
            Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
            Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
        }
    }
}

唯恐会见根据业务员需要同控件的特性来调整代码。
此外,可能要呢不同的控件类型引入更多的重载方法。

 

背景

自以一个要好计划之粗略打受相遇了问题:我计划了一如既往玉分辨率为1920×1080底机器,
但是当自身待在笔记本电脑上广播时,发现应用程序边界跑至屏幕外。由此大有必要为程序来适应不同分辨率的装置,而非是叫用户来适应程序。
因此,我对代码进行了改进。

 

结尾

始建响应式WinForm应用程序,根据机器的运作时刻分辨率自动调整大小,重新定位字体大小并重新校准字体大小,这是相同栽面向开发人员的不二法门。
只待将此类添加到品种被,在App.config文件中安规划时分辨率,然后以窗体的加载事件备受长响应代码。
So easy!

2。如果是自动版本,那么一旦优先鼠标左键点小黑人的底层,然后鼠标右键点目标位置的中游。
接触了右键后。程序会活动算有片沾中离开和时光。然后就跨越一步了。这个没有啊技艺问题

adb shell screencap -p /sdcard/1.png
adb pull /sdcard/1.png D:/Download/
adb shell rm /sdcard/1.png
adb shell input swipe 100 100 200 200 500

  • 界面转到微信跳一跨越游戏,点击开始打
    运作活动/半自动版本程序,就可初步打之路

  •  

View Code

此是.net发送命令相关代码

public string AdbCommand(string arg)
        {
            using (Process process = new Process())
            {
                var adbDirectoryPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AndoridAdb");
                var adbPath = Path.Combine(adbDirectoryPath, "adb.exe");
                process.StartInfo.FileName = adbPath;
                process.StartInfo.Arguments = arg;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardInput = true;   //重定向标准输入   
                process.StartInfo.RedirectStandardOutput = true;  //重定向标准输出   
                process.StartInfo.RedirectStandardError = true;   //重定向错误输出
                process.StartInfo.CreateNoWindow = true;
                process.Start();
                var result = process.StandardOutput.ReadToEnd();
                process.WaitForExit();
                process.Close();
                return result;
            }
        }

WeChat.AutoJump.WinApp

电动版本

当下次分成“全自动版本”和“半机动版本”

3。如果是全自动版本,那倒第一步,你将到屏幕截图继。要分析出多少黑人的职
自己这里的言辞。就因故了EmguCV (OpenCV的.net调用)。
咱俩可以就此到OpenCV的模版匹配。MatchTemplate方法
模板的话语。随便找一张屏幕截图,用PS把有些黑人扣出来。保存也图就得了
MatchTemplate会找来配合最高的接触。然后于出坐标,这样,我们不怕得算有多少黑人的基本位置了

**

这个本要鼠标左键点多少黑人的底色,鼠标右键点目标位之基本

点击”开始玩”后。运行此程序。就好实现活动跳了

当手机连接好后,打开微信跳一跨

WeChat.AutoJump.CMDApp

眼下支出之保有代码都曾上传到了GitHub。欢迎大家来Star

View Code

https://github.com/GiantLiu/AutoJump

次第原理
1。将手机点击到《跳一超过》小序界面;点击“开始玩”后
2。用Adb工具得到当前手机的截图,半产充斥及地头
3.1。如果是全自动版本,那么就要用鼠标左右键来点击开始与目标位置
下一场程序会活动算有要跳的距离与如点击屏幕的年月。
3.2。如果是全自动版本,那么程序会自动算有多少黑人的职和对象的中坚点,
下一场自行算去及点击屏幕的年月。

 

var tempGrayPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Template", "Current.png");

            var tempGrayImg = new Image<Rgb, byte>(tempGrayPath);

            var match = img.MatchTemplate(tempGrayImg, TemplateMatchingType.CcorrNormed);

            double min = 0, max = 0;
            Point maxp = new Point(0, 0);//最好匹配的点
            Point minp = new Point(0, 0);
            CvInvoke.MinMaxLoc(match, ref min, ref max, ref minp, ref maxp);
            Console.WriteLine(min + " " + max);
            CvInvoke.Rectangle(img, new Rectangle(maxp, new Size(tempGrayImg.Width, tempGrayImg.Height)), new MCvScalar(0, 0, 255), 3);

            var startPoint = new Point();
            startPoint.X = maxp.X + (int)(tempGrayImg.Width / 2.0);
            startPoint.Y = maxp.Y + tempGrayImg.Height - 2;
            CvInvoke.Rectangle(img, new Rectangle(startPoint, new Size(1, 1)), new MCvScalar(0, 0, 0), 3);

  第一漫漫命令是管屏幕的截图以png格式保存到手机SD卡
  第二长命令是把手机SD卡里面的图片下载到当地硬盘对应之目录
  第三长长的命令是拿手机里的截图删除
  第四久命令是殡葬屏幕仍压命令
从X:100,Y:100这个岗位为X200,Y:200此职位走,其中时间吧500毫秒

找到了有关的触及。计算小黑人和对象的离就无是难题了
接下来就是殡葬超过的一声令下,一个步骤就是完了了

代码关键实现
1。通过adb拿到手机的屏幕截图,其实就是是朝着手机发送有关的授命

Point topPoint = new Point();
            for (int i = 0; i < halfImg.Rows; i++)
            {
                for (int j = 0; j < halfImg.Cols - 1; j++)
                {
                    var cur = halfImg[i, j];
                    var next = halfImg[i, j + 1];
                    if (Math.Abs(RgbHelp.GetDiff(cur, next)) > 2)
                    {
                        var x = 2;
                        next = halfImg[i, j + x];
                        while (Math.Abs(RgbHelp.GetDiff(cur, next)) > 2)
                        {
                            x++;
                            next = halfImg[i, j + x];
                        }
                        topPoint.Y = i;
                        topPoint.X = j + (int)(x / 2.0);
                        break;
                    }
                }
                if (!topPoint.IsEmpty) break;
            }
            CvInvoke.Rectangle(halfImg, new Rectangle(topPoint, new Size(1, 1)), new MCvScalar(0, 0, 255), 3);

            ////这个顶点在原图中的位置
            var oldTopX = topPoint.X;
            if (!targetInLeft) oldTopX += imgWidthCenter;
            var oldTopY = topPoint.Y + imgHeightSplit;
            var oldTopPoint = new Point(oldTopX, oldTopY);
            CvInvoke.Rectangle(img, new Rectangle(oldTopPoint, new Size(1, 1)), new MCvScalar(0, 0, 255), 3);
////裁剪查找区域
            ////原图片1/3以下,小黑人以上
            var newImgStart = imgHeightSplit;
            var newImgEnd = maxp.Y + tempGrayImg.Height;
            var newImgHeight = newImgEnd - newImgStart;
            Rectangle rect = new Rectangle(0, newImgStart, img.Width, newImgHeight);

            CvInvoke.cvSetImageROI(sourceImg, rect);
            var newImg = new Image<Rgb, byte>(sourceImg.Width, newImgHeight);
            CvInvoke.cvCopy(sourceImg, newImg, IntPtr.Zero);



            ////看小黑人在程序的左边还是右边
            ////如果在左边,那目标点就在图片的右边
            bool targetInLeft = true;
            if (maxp.X < imgWidthCenter) targetInLeft = false;

            Rectangle halfRect;
            if (targetInLeft)
                halfRect = new Rectangle(0, 0, imgWidthCenter, newImgHeight);
            else
                halfRect = new Rectangle(imgWidthCenter, 0, imgWidthCenter, newImgHeight);

            CvInvoke.cvSetImageROI(newImg, halfRect);
            var halfImg = new Image<Rgb, byte>(imgWidthCenter, newImgHeight);
            CvInvoke.cvCopy(newImg, halfImg, IntPtr.Zero);

View Code

4。目标位置计算,
当时也是程序太复杂的片了,
自我之兑现步骤为
1:先将图纸裁剪到仅仅保留中间的1/3可行分析区域
2:看有些黑人在屏幕的左侧还是右手,那么目标就会于反的区域。这样咱们即便可以将目标区域的图样剪切下来

接下来程序就算会自行跳到对应的岗位

4。用Adb工具往手机发送点击屏幕蓄力命令,完成同样次等跳动