1

私は新しいプログラマーで、画面上の特定の座標をクリックして画面から画像を検索し、見つけたらクリックするプログラムをc#で作成しようとしています。プログラムは正常に動作していますが、30 ~ 40 分後にクラッシュします。クラッシュするとウィンドウがポップアップします - アプリケーションで未処理の例外が発生しました....

パラメータが無効です

詳細は次のとおりです。

See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.ArgumentException: Parameter is not valid.
   at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
   at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)
   at Uncle_s_Bot.Form1.Screenshot()
   at Uncle_s_Bot.Form1.btnStart_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

こことプログラムのコード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;

namespace Uncle_s_Bot
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData,
        int dwExtraInfo);

        public enum MouseEventFlags : uint
        {
            MOUSEEVENTF_ABSOLUTE = 0x8000,
            MOUSEEVENTF_LEFTDOWN = 0x0002,
            MOUSEEVENTF_LEFTUP = 0x0004,
            MOUSEEVENTF_MIDDLEDOWN = 0x0020,
            MOUSEEVENTF_MIDDLEUP = 0x0040,
            MOUSEEVENTF_MOVE = 0x0001,
            MOUSEEVENTF_RIGHTDOWN = 0x0008,
            MOUSEEVENTF_RIGHTUP = 0x0010,
            MOUSEEVENTF_XDOWN = 0x0080,
            MOUSEEVENTF_XUP = 0x0100,
            MOUSEEVENTF_WHEEL = 0x0800,
            MOUSEEVENTF_HWHEEL = 0x01000
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            Bitmap bmpScreenshot;
            Point location;
            bool success;
            bool MaybeAvailable = false;


            while (true)
            {
                // Point 1
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(95, 140);
                        mouseClick();
                        Thread.Sleep(7500);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);

                // Point 2
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(135, 135);
                        mouseClick();
                        Thread.Sleep(10000);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);

                // Point 3
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(180, 140);
                        mouseClick();
                        Thread.Sleep(10000);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);

                // Point 4
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(190, 170);
                        mouseClick();
                        Thread.Sleep(8500);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);

                // Point 5
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(150, 185);
                        mouseClick();
                        Thread.Sleep(10000);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);

                // Point 6
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(180, 210);
                        mouseClick();
                        Thread.Sleep(10000);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);

                // Point 7
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(150, 240);
                        mouseClick();
                        Thread.Sleep(8500);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);

                // Point 8
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(95, 235);
                        mouseClick();
                        Thread.Sleep(9500);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);

                // Point 9
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(110, 200);
                        mouseClick();
                        Thread.Sleep(10000);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);

                // Point 10
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(80, 170);
                        mouseClick();
                        Thread.Sleep(10000);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);

                // Point 11
                do
                {
                    bmpScreenshot = Screenshot();
                    success = FindBitmap(Properties.Resources.bmp_Bonus, bmpScreenshot, out location);
                    if (success == true)
                    {
                        Cursor.Position = location;
                        mouseClick();
                        Thread.Sleep(1500);
                        MaybeAvailable = true;
                    }
                    else
                    {
                        Cursor.Position = new Point(120, 165);
                        mouseClick();
                        Thread.Sleep(11500);
                        MaybeAvailable = false;
                    }
                }
                while (MaybeAvailable);
            }

        }

        private void mouseClick()
        {
            mouse_event((uint)MouseEventFlags.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
            Thread.Sleep((new Random()).Next(20, 30));
            mouse_event((uint)MouseEventFlags.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
        }

        private Bitmap Screenshot()
        {
            // save snapshot of screen
            Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);

            // create a graphic object so we can draw the screen in the bitmap
            Graphics g = Graphics.FromImage(bmpScreenshot);

            // copy from screen into the bitmap we created
            g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);

            // return the screenshot
            return bmpScreenshot;
        }

        // Find location of a bitmap within another bitmap and return if it was succesufulyy found
        private bool FindBitmap(Bitmap bmpNeedle, Bitmap bmpHaystack, out Point location)
        {
            for (int outerX = 0; outerX < bmpHaystack.Width - bmpNeedle.Width; outerX++)
            {
                for (int outerY = 0; outerY < bmpHaystack.Height - bmpNeedle.Height; outerY++)
                {
                    for (int innerX = 0; innerX < bmpNeedle.Width; innerX++)
                    {
                        for (int innerY = 0; innerY < bmpNeedle.Height; innerY++)
                        {
                            Color cNeedle = bmpNeedle.GetPixel(innerX, innerY);
                            Color cHaystack = bmpHaystack.GetPixel(innerX + outerX, innerY + outerY);

                            if (cNeedle.R != cHaystack.R || cNeedle.G != cHaystack.G || cNeedle.B != cHaystack.B)
                            {
                                goto notFound;
                            }
                        }
                    }
                    location = new Point(outerX, outerY);
                    return true;
                notFound:
                    continue;
                }
            }
            location = Point.Empty;
            return false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}
4

1 に答える 1

0

新しいビットマップ、グラフィックスを作成すると、内部 GDI+ 関数呼び出しが発生します。これらの関数はすべてエラーになる可能性があり、エラーは .NET 例外に変換されます (残念ながら、追加のパラメーター名や情報などはありません)。このため、一部のエラーは理解するのが非常に難しい場合があります。

ハンドル リークとメモリ リークが原因で、いくつかの問題が発生する可能性があります (GDI+ の場合)。たとえば、非常に大きなビットマップを多数作成すると、管理されていない領域に多数の連続したブロックが割り当てられます。GC はメモリ プレッシャを認識せず、クリーンアップを試みません。たとえば、100 回の呼び出しの後に十分な大きさの Width と Height を渡すと、メモリ不足に気づき、ArgumentException をスローして幅と高さが大きすぎると不平を言う可能性があります。

まず、ビットマップが必要ない場合は廃棄することを検討してください。グラフィックスも忘れずに処分してください。

問題が解決しない場合は、お知らせください。

于 2015-07-28T11:14:05.663 に答える