2016-03-25 2 views
0

Я создаю приложение для записи на рабочем столе (запись на экране) с использованием Directshow.NET и C#. Я почти готов, приложение может записывать рабочий стол. Красить указатель мыши в записи видео я реализовал BufferCB от SampleGrabber и с помощью моего другого поста Fliped cursor icon on desktop recording using directshow я могу рисовать указатель мыши в правильной ориентациипроблема с вопросом «Параметр недопустим» внутри BufferCB

Вот мой код BufferCB:

[System.Security.Permissions.SecurityPermission(
System.Security.Permissions.SecurityAction.LinkDemand, Flags = 
System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)] 
int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen) 
{ 
    if (!wait) 
    { 
     wait = true; 
     Rectangle imageBounds = new Rectangle(0, 0, m_videoWidth, m_videoHeight); 
     Bitmap bitmap = new Bitmap(m_videoWidth, m_videoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
     System.Drawing.Imaging.BitmapData bitmapData = bitmap.LockBits(imageBounds, System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat); 
     IntPtr ptr = bitmapData.Scan0; 
     bitmap.UnlockBits(bitmapData); 
     CopyMemory(ptr, pBuffer, (uint)BufferLen); 
     bitmap.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipY); 
     using (Graphics g = Graphics.FromImage(bitmap)) 
     { 
      CURSORINFO cursorInfo; 
      cursorInfo.cbSize = Marshal.SizeOf(typeof(CURSORINFO)); 

      if (GetCursorInfo(out cursorInfo) && cursorInfo.flags == CURSOR_SHOWING) 
      {       
       IntPtr iconPointer = CopyIcon(cursorInfo.hCursor); 
       ICONINFO iconInfo; 
       int iconX, iconY; 
       if (GetIconInfo(iconPointer, out iconInfo)) 
       { 
        // calculate the correct position of the cursor 
        iconX = cursorInfo.ptScreenPos.x - ((int)iconInfo.xHotspot); 
        iconY = cursorInfo.ptScreenPos.y - ((int)iconInfo.yHotspot); 

        //GETTING ARGUMENTEXCEPTION AT BELOW LINE         
        IntPtr hdc = g.GetHdc(); 
        DrawIcon(hdc, iconX, iconY, cursorInfo.hCursor);         
        g.ReleaseHdc(hdc);         
       }       
      } 
      g.DrawImage(companylogo, m_videoWidth - 100 , 20); 
     } 
     bitmap.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipY); 
     bitmapData = bitmap.LockBits(imageBounds, System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat); 
     ptr = bitmapData.Scan0; 
     bitmap.UnlockBits(bitmapData);     
     CopyMemory(pBuffer, ptr, (uint)BufferLen); 
     bitmap.Dispose(); 
     wait = false; 
    } 
    return 0; 
} 

Указатель мыши получает краску на видео, но после некоторого времени записи я получаю ArgumentException"Parameter is not valid." в строке кода IntPtr hdc = g.GetHdc();

Может ли кто-нибудь помочь мне решить эту проблему?

StackTrace:
в System.Drawing.Graphics.GetHdc()

+0

Утечка памяти, ведущая к точке, где происходит отказ от другого постоянного тока? –

+1

См. [This] (http://stackoverflow.com/questions/3818440/parameter-is-not-valid-thrown-from-system-drawing-graphics-gethdc-only-on) вопрос. –

+0

@ RomanR. почему происходит утечка памяти, поскольку я использую блок, который позаботится об утилизации объекта Graphics. – Amogh

ответ

1

Посмотрите ответ в this вопрос. Они обсуждают одно и то же сообщение об ошибке.