Я отвечаю на этот вопрос после того, как у меня возникла та же проблема и была решена.
Несмотря на то, что OEM-производители могут не включать некоторые части ОС в состав WindowsCE (такова природа модульной архитектуры), также верно, что такие вызовы, как EnumWindows или большинство других низкоуровневых вызовов, являются неотъемлемой частью ОС, и было бы безумно удалять их.
Я действительно получил сообщение отинженер Microsoft (!), который указал, что проблема заключается в том, как определяется обратный вызов.Хотя я пробовал разные подходы (делегаты, intPtr против int и другие), он дал следующий ответ, который на самом деле хорошо работает в WindowsCE 5/6 для разных устройств:
" [« EnumWindows call from.Приложение Net / C # приводит к ошибке NotSupportedException 0x80131515 ”, поскольку оно поддерживает ТОЛЬКО целочисленные типы возврата: I2, I4 и т. Д. Это относится ко всем методам обратного вызова и может варьироваться в зависимости от используемого вызова] "
ИтакВместо того, чтобы определять ваш обратный вызов, как вы (я пробовал делегатов, WinProcs и другие также безуспешно), определите его как:
[DllImport("coredll.dll")]
[return: MarshalAs(UnmanagedType.I4)]
private static extern int EnumWindows(IntPtr callPtr, int param);
, который работает отлично !!
Вот моя работакод, реализующий этот подход и безупречно работающий на разных устройствах под управлением PocketPC / WindowsCE и т. д.:
public delegate int CallBackPtr(int hwnd, int param);
[DllImport("coredll.dll")]
[return: MarshalAs(UnmanagedType.I4)]
private static extern int EnumWindows(IntPtr callPtr, int param);
private static List<IntPtr> windows = new List<IntPtr>();
private static int CallBackMethod(int hwnd, int param)
{
windows.Add(new IntPtr(hwnd));
return 1;
}
private static void GetAllWindowsHandles()
{
// using a delegate does NOT work.
//EnumWindows(delegate(IntPtr wnd, IntPtr param)
//{
// windows.Add(wnd);
// return true;
//}, IntPtr.Zero);
CallBackPtr callbackPtr = CallBackMethod;
IntPtr cb = Marshal.GetFunctionPointerForDelegate(callbackPtr);
EnumWindows(cb, 0);
}
CJ.