काम करता है मुझे एक WPF अनुप्रयोग में कस्टम कर्सर के साथ समस्या हो रही है। मैं Cursor
वस्तुओं को बनाने के लिए निम्न कोड का उपयोग करें:SafeFileHandle.Close एक अपवाद फेंकता है लेकिन हैंडल मान्य है और
System.Runtime.InteropServices.SEHException was unhandled
Message=External component has thrown an exception.
Source=mscorlib
ErrorCode=-2147467259
StackTrace:
at Microsoft.Win32.Win32Native.CloseHandle(IntPtr handle)
at Microsoft.Win32.SafeHandles.SafeFileHandle.ReleaseHandle()
at System.Runtime.InteropServices.SafeHandle.InternalDispose()
at System.Runtime.InteropServices.SafeHandle.Dispose(Boolean disposing)
at System.Runtime.InteropServices.SafeHandle.Dispose()
at System.Windows.Input.Cursor.Finalize()
InnerException:
मैं रखकर कुछ आगे की जांच पड़ताल किया:
[DllImport("user32.dll")]
private static extern IntPtr CreateIconIndirect(ref IconInfo icon);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
private static Cursor CreateCursor(string cursorName, System.Drawing.Bitmap bmp,
int xHotspot, int yHotspot, out SafeFileHandle handle)
{
IconInfo tmp = new IconInfo();
GetIconInfo(bmp.GetHicon(), ref tmp);
tmp.xHotspot = xHotspot;
tmp.yHotspot = yHotspot;
tmp.fIcon = false;
IntPtr ptr = CreateIconIndirect(ref tmp);
handle = new SafeFileHandle(ptr, true);
if (handle.IsClosed)
{
return null;
}
Cursor cur = CursorInteropHelper.Create(handle);
return cur;
}
जब मैं अपने आवेदन को बंद करने और जीसी कचरा उठा शुरू होता है, यह एक अपवाद फेंकता if (handle.IsClosed)
पर ब्रेकपॉइंट और handle.Close()
पर कॉल करने के लिए तत्काल विंडो का उपयोग करना। SafeFileHandle
के कुछ करीबी बस ठीक है, दूसरों ने हैंडल बनने के तुरंत बाद — को एक ही अपवाद फेंक दिया।
और चीजों को मजेदार बनाने के लिए, हैंडल स्वयं ठीक काम करते हैं। IsInvalid
गलत है, IsClosed
गलत है, और कर्सर प्रकट होते हैं। यह सिर्फ कुछ हैंडल कभी बंद नहीं किया जा सकता है।
जैसा कि मैं मैन्युअल रूप से हैंडल को बंद करने का इरादा नहीं रखता हूं, और एप्लिकेशन बंद होने पर Cursor
ऑब्जेक्ट्स को अंतिम रूप देने के दौरान ही उन्हें बंद कर दिया जाएगा, मैं उन्हें केवल अनदेखा कर सकता हूं। मैंने वीएस -2010 के बाहर रिलीज बिल्डिंग की कोशिश नहीं की है और मुझे नहीं पता कि इससे क्रैश संवाद दिखाई देगा या नहीं। लेकिन अगर मैं उन्हें अनदेखा कर सकता हूं, तो यह अभी भी गन्दा है।
तो मूल रूप से मैं यहां क्या गलत हो रहा है, इस पर किसी भी जानकारी की तलाश कर रहा हूं, जहां इसे देखने और डीबग करने के लिए देखना है ... सबकुछ मूल कोड या जीसी में लगता है और मैं इसे किसी भी डीबग नहीं कर सकता ।
धन्यवाद! मैं डब्ल्यूपीएफ के लिए बिल्कुल नया हूं, कभी WinForms नहीं किया, और यह मेरा पहला समय देशी कोड से निपटने के लिए है। और आपकी टिप्पणी हटाने और इसे उत्तर देने के लिए धन्यवाद। :) –
@RyanP आपका स्वागत है। ऐसी चीजें याद करने में आसान होती हैं, खासकर यदि सबकुछ पहले दिखने पर काम करता है। – ordag
उस समाधान के लिए धन्यवाद! – Kai