GetIconInfo 函数无法正常工作
我编写了一个应用程序,它使用 user32.dll
的 GetIconInfo
函数获取当前光标的图标信息,它在一段时间内工作正常,但一段时间后它开始提供ICONINFO.hbmMask
中的信息错误(某些负值),当我在下一行尝试从 Bitmap.HBitmap(bitmask)
获取 Bitmap 对象时,它会抛出异常:
A Generic error occured in GDI+.
从那里开始,它不断地给出这个异常,因为 GetIconInfo
总是返回负值(所有这些代码都在循环中工作)..
任何人都可以告诉我这个问题是什么?以及如何避免下一次迭代异常?
这是代码
while (true)
{
//DLLimport User32.dll
PlatformInvokeUSER32.ICONINFO temp;
//Get the current cursor
IntPtr curInfo = GetCurrentCursor();
Cursor cur;
Icon ic;
if (curInfo != null && curInfo.ToInt32() != 0 && isOSelected)
{
cur = CheckForCusrors(curInfo);
try
{
//Dllimport User32.dll
//after some time the temp.hbmMask begin to get -ive vlaue from following function call
PlatformInvokeUSER32.GetIconInfo(curInfo, out temp);
if (temp.hbmMask != IntPtr.Zero)
{
//due to negative value of hbmMask the following function generates an exception
Bitmap bitmask = Bitmap.FromHbitmap(temp.hbmMask);
ic = Icon.FromHandle(curInfo);
Bitmap bmpCur = ic.ToBitmap();
}
}
catch (Exception ee)
{
//Exception message is
//A Generic error occured in GDI+
//and this loop begins to throw exception continuously
}
}
}// while ended
I have written an application which is getting the Icon info of current cursor using GetIconInfo
function of user32.dll
, It works fine for some time, but after some time it starts providing wrong information in ICONINFO.hbmMask
(some negative value), and when on the next line I try to get Bitmap object from Bitmap.HBitmap(bitmask)
, it throws an exception:
A Generic error occured in GDI+.
From there onwords, it continuously gives this exception, as GetIconInfo
always return negative value (all this code is working in a loop)..
Can any one tell me what this problem is? and how to avoid the next iteration exception?
Here is the code
while (true)
{
//DLLimport User32.dll
PlatformInvokeUSER32.ICONINFO temp;
//Get the current cursor
IntPtr curInfo = GetCurrentCursor();
Cursor cur;
Icon ic;
if (curInfo != null && curInfo.ToInt32() != 0 && isOSelected)
{
cur = CheckForCusrors(curInfo);
try
{
//Dllimport User32.dll
//after some time the temp.hbmMask begin to get -ive vlaue from following function call
PlatformInvokeUSER32.GetIconInfo(curInfo, out temp);
if (temp.hbmMask != IntPtr.Zero)
{
//due to negative value of hbmMask the following function generates an exception
Bitmap bitmask = Bitmap.FromHbitmap(temp.hbmMask);
ic = Icon.FromHandle(curInfo);
Bitmap bmpCur = ic.ToBitmap();
}
}
catch (Exception ee)
{
//Exception message is
//A Generic error occured in GDI+
//and this loop begins to throw exception continuously
}
}
}// while ended
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你的循环有多大? GDI+ 资源是操作系统资源,可用性有限。
您可以通过监视进程分配的句柄来查明这是否是您的问题。如果当某个句柄计数(HBITMAP 或 HICON)达到限制时 GDI+ 开始抱怨,那么您就知道必须更智能地处理资源。您可以首先使用任务管理器来执行此操作,但可能希望切换到更复杂的软件,例如 进程浏览器。
如果这是您的问题,那么您需要阅读IDisposable 并确保在处理完对象后对它们调用
Dispose
(将不再渲染)。位图和图标以及大多数 GDI+ 对象都实现 IDisposable。此外,我还不清楚,但您可能需要对某些原始 GDI 对象本身调用
DeleteObject
(一切都取决于您从何处获取它们的句柄)。How large is your loop? GDI+ resources are OS resources and are limited in availability.
You can find out if this is your problem by monitoring the HANDLEs allocated by your process. If GDI+ starts to complain when a certain handle count (HBITMAP or HICON) reaches a limit, then you know you have to deal with your resources more intelligently. You can start by using Task Manager to do this but might want to switch to more sophisticated software like Process Explorer.
If this is your problem, then you need to read about IDisposable and make sure you call
Dispose
on your objects after you're done with them (won't be rendered anymore). Bitmaps and Icons and most GDI+ objects implement IDisposable.Furthermore, it's unclear to me, but you may need to call
DeleteObject
on some of the raw GDI objects themselves (all depends upon where you got their handles).查看此 PInvoke 示例,您是否正确删除了要删除的对象通过非托管代码拉入?
Check out this PInvoke sample, are you properly deleting the objects you are pulling in through unmanaged code?