我在timer事件中执行下面代码,每隔一秒执行一次。每当到1个多小时后就会出现异常:system.argumentexception,在system.drawing中。我看了代码,问题应该就出现在这里面,是资源没回收?还是其他什么问题?//-----------------------------Timer Interval=1000-------------------------
// 创建显示器的DC 
            IntPtr hdlDisplay = CreateDC("DISPLAY", null, null, IntPtr.Zero);
            // 从指定设备的句柄创建新的 Graphics 对象 
            Graphics gfxDisplay = Graphics.FromHdc(hdlDisplay);
            // 创建只有一个象素大小的 Bitmap 对象 
            Bitmap bmp1 = new Bitmap(1, 1, gfxDisplay);            // 从指定 Image 对象创建新的 Graphics 对象 
            Graphics gfxBmp1 = Graphics.FromImage(bmp1);            // 获得屏幕的句柄 
            IntPtr hdlScreen = gfxDisplay.GetHdc();
            // 获得位图的句柄 
            IntPtr hdlBmp1 = gfxBmp1.GetHdc();            BitBlt(hdlBmp1, 0, 0, 1, 1, hdlScreen, Convert.ToInt32(textBoxHPX.Text), Convert.ToInt32(textBoxHPY.Text), 13369376);            // 释放屏幕句柄 
            gfxDisplay.ReleaseHdc(hdlScreen);
            // 释放位图句柄 
            gfxBmp1.ReleaseHdc(hdlBmp1);            Color temp1 = bmp1.GetPixel(0, 0); // 获取像素的颜色 
           
            if (temp1.ToArgb().ToString("x").ToUpper() != textBoxHPColor.Text)
            {
                if (checkBoxPad1.Checked == true)
                {
                    kk.MykeyDown((int)key.VirtualKeys.VK_NUMPAD1);
                    System.Threading.Thread.Sleep(200);
                    kk.MykeyUp((int)key.VirtualKeys.VK_NUMPAD1);
                    System.Threading.Thread.Sleep(numpaddul);
                }                if (checkBoxPad2.Checked == true)
                {
                    kk.MykeyDown((int)key.VirtualKeys.VK_NUMPAD2);
                    System.Threading.Thread.Sleep(200);
                    kk.MykeyUp((int)key.VirtualKeys.VK_NUMPAD2);
                    System.Threading.Thread.Sleep(numpaddul);
                }                if (checkBoxPad3.Checked == true)
                {
                    kk.MykeyDown((int)key.VirtualKeys.VK_NUMPAD3);
                    System.Threading.Thread.Sleep(200);
                    kk.MykeyUp((int)key.VirtualKeys.VK_NUMPAD3);
                    System.Threading.Thread.Sleep(numpaddul);
                }                if (checkBoxPad4.Checked == true)
                {
                    kk.MykeyDown((int)key.VirtualKeys.VK_NUMPAD4);
                    System.Threading.Thread.Sleep(200);
                    kk.MykeyUp((int)key.VirtualKeys.VK_NUMPAD4);
                    System.Threading.Thread.Sleep(numpaddul);
                }                if (checkBoxPad5.Checked == true)
                {
                    kk.MykeyDown((int)key.VirtualKeys.VK_NUMPAD5);
                    System.Threading.Thread.Sleep(200);
                    kk.MykeyUp((int)key.VirtualKeys.VK_NUMPAD5);
                    System.Threading.Thread.Sleep(numpaddul);
                }                if (checkBoxPad6.Checked == true)
                {
                    kk.MykeyDown((int)key.VirtualKeys.VK_NUMPAD6);
                    System.Threading.Thread.Sleep(200);
                    kk.MykeyUp((int)key.VirtualKeys.VK_NUMPAD6);
                    System.Threading.Thread.Sleep(numpaddul);
                }                if (checkBoxPad7.Checked == true)
                {
                    kk.MykeyDown((int)key.VirtualKeys.VK_NUMPAD7);
                    System.Threading.Thread.Sleep(200);
                    kk.MykeyUp((int)key.VirtualKeys.VK_NUMPAD7);
                    System.Threading.Thread.Sleep(numpaddul);
                }                if (checkBoxPad8.Checked == true)
                {
                    kk.MykeyDown((int)key.VirtualKeys.VK_NUMPAD8);
                    System.Threading.Thread.Sleep(200);
                    kk.MykeyUp((int)key.VirtualKeys.VK_NUMPAD8);                    
                }
            }
            textBoxHPColorShow.Text = temp1.ToArgb().ToString("x").ToUpper()+"|"+textBoxHPColor.Text;            gfxDisplay.Dispose();
            gfxBmp1.Dispose();
            bmp1.Dispose(); // 释放 bmp 所使用的资源 //-----------------------------------------------------------------------
/*
[DllImport("gdi32.dll")]
        private static extern bool BitBlt(
             IntPtr hdcDest, // 目标设备的句柄 
             int nXDest, // 目标对象的左上角的X坐标 
             int nYDest, // 目标对象的左上角的X坐标 
             int nWidth, // 目标对象的矩形的宽度 
             int nHeight, // 目标对象的矩形的长度 
             IntPtr hdcSrc, // 源设备的句柄 
             int nXSrc, // 源对象的左上角的X坐标 
             int nYSrc, // 源对象的左上角的X坐标 
             int dwRop // 光栅的操作值 
        );        [DllImport("gdi32.dll")]
        private static extern IntPtr CreateDC(
             string lpszDriver, // 驱动名称 
             string lpszDevice, // 设备名称 
             string lpszOutput, // 无用,可以设定位"NULL" 
             IntPtr lpInitData // 任意的打印机数据 
        ); 
*/

解决方案 »

  1.   

    用GUI+,为什么还要使用API来画图?看是不是timer的间隔太短了,原来的代码还没执行就又再次执行timer中的代码。然后system.argumentexception应该是参数错误,看看报错的是那1句代码,看看这句代码中传的参数有没有问题
      

  2.   

    用GUI+,为什么还要使用API来画图?
      

  3.   

    要取点像素,对GUI+不熟悉,所以用了API
    我CreateDC后没有DeleteDC,所以出现上面问题了结帖,谢谢大家!