BufferCB 内部面临 "Parameter is not valid" 的问题
facing issue of "Parameter is not valid" inside BufferCB
我正在使用 Directshow.NET 和 C# 创建桌面录制(屏幕录制)应用程序。我快完成了,应用程序可以录制桌面屏幕了。要在录制视频中绘制鼠标指针,我已经从 SampleGrabber
实现了 BufferCB
,并且在我的另一个 post 的帮助下,我能够以正确的方向绘制鼠标指针
这是我的 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;
}
鼠标指针在视频上画画,但在录制一段时间后,我在代码行 IntPtr hdc = g.GetHdc();
处得到 ArgumentException
"Parameter is not valid."
谁能帮我解决这个问题?
StackTrace:
at System.Drawing.Graphics.GetHdc()
查看 this 问题中的答案。
他们讨论了相同的错误消息。
我正在使用 Directshow.NET 和 C# 创建桌面录制(屏幕录制)应用程序。我快完成了,应用程序可以录制桌面屏幕了。要在录制视频中绘制鼠标指针,我已经从 SampleGrabber
实现了 BufferCB
,并且在我的另一个 post
这是我的 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;
}
鼠标指针在视频上画画,但在录制一段时间后,我在代码行 IntPtr hdc = g.GetHdc();
ArgumentException
"Parameter is not valid."
谁能帮我解决这个问题?
StackTrace:
at System.Drawing.Graphics.GetHdc()
查看 this 问题中的答案。 他们讨论了相同的错误消息。