面对问题"参数无效"在BufferCB里面

时间:2016-03-25 10:16:14

标签: c# directshow directshow.net

我正在使用Directshow.NET和C#创建桌面录制(屏幕录制)应用程序。我差不多完成了,应用程序能够记录桌面屏幕。要在录制视频中绘制鼠标指针,我已经BufferCB实现了SampleGrabber并在我的另一篇文章Fliped cursor icon on desktop recording using directshow的帮助下,我能够以正确的方向绘制鼠标指针

以下是我的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();

任何人都可以帮我解决这个问题吗?

  

堆栈跟踪:
   在System.Drawing.Graphics.GetHdc()

1 个答案:

答案 0 :(得分:1)

查看this问题中的答案。 他们讨论了相同的错误信息。