Моя программа выполняет автоматические щелчки в форме 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.