C # AccessViolationException неуправляемые методы - PullRequest
1 голос
/ 19 января 2012

Моя программа выполняет автоматические щелчки в форме Windows, если цвет пикселя под мышью имеет определенный цвет.Теперь проблема в том, что иногда, может быть, через час, или, может быть, после 5 часов работы программы (и работает, казалось бы, совершенно нормально), происходит сбой всей системы (ОС).Иногда я могу поймать AccessViolationException.Я почти уверен, что сбой связан с неуправляемыми методами, которые я должен вызывать, чтобы щелкнуть мышью и получить цвет пикселя экрана.Но, черт возьми, я не могу понять, что не так.Я использую следующий код для щелчков мыши:

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    static extern void mouse_event(uint dwFlags, uint dx, uint dy,
                           uint dwData, UIntPtr dwExtraInfo);

private const uint MOUSEEVENTF_LEFTDOWN = 0x02;
private const uint MOUSEEVENTF_LEFTUP = 0x04;

public void DoMouseClick()
    {
            //Call the imported function with the cursor's current position
            uint X = (uint)Cursor.Position.X;
            uint Y = (uint)Cursor.Position.Y;
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, UIntPtr.Zero);
    }

И для получения цвета пикселя я использую это:

[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hwnd);

[DllImport("user32.dll")]
static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);

[DllImport("gdi32.dll")]
static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);

static public System.Drawing.Color GetPixelColor(int x, int y)
{
    IntPtr hdc = GetDC(IntPtr.Zero);
    uint pixel = GetPixel(hdc, x, y);
    ReleaseDC(IntPtr.Zero, hdc);
    Color color = Color.FromArgb((int)(pixel & 0x000000FF),
                     (int)(pixel & 0x0000FF00) >> 8,
                     (int)(pixel & 0x00FF0000) >> 16);
    return color;
}

Оба метода в основном копируются из Интернета,Я использую этот материал, как упоминалось ранее в Windows Forms.Forms.Timer работает все время, не знаю, имеет ли это значение ... при запуске этого на 64-битной Windows, программа скомпилирована для цели x86.

edit: причина, по которой яЯ уверен, что неуправляемые методы ответственны за то, как выглядит эта трассировка стека AccessViolationException ("bei" = "at"):

bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
   bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   bei System.Windows.Forms.Application.Run(Form mainForm)
   bei McDonaldsVote.Program.Main(String[] args) in C:\Users\Chris\Documents\Visual Studio 2008\Projects\McDonaldsVote\McDonaldsVote\Program.cs:Zeile 22.
...