Создание окна WinApi в .Net

Здравствуйте. Пытаюсь создать окно в шарпе. Но по какой то неведомой причине не пашет.

        public static IntPtr CreateWindow(IntPtr hinstance)
        {
            WNDCLASSEX wcx = new WNDCLASSEX();
            wcx.cbSize = Marshal.SizeOf(wcx);
            wcx.lpfnWndProc = Marshal.GetFunctionPointerForDelegate((Delegate)(WndProc)MainWndProc); 
            wcx.hInstance = hinstance; 
            wcx.lpszClassName = "MainWClass";
            wcx.style = (int)(ClassStyles.VerticalRedraw | ClassStyles.HorizontalRedraw);
            wcx.cbWndExtra = 32;

            var ret = RegisterClassEx(ref wcx);
            string message = new Win32Exception(Marshal.GetLastWin32Error()).Message;


            if (ret != 0)
            {                
                //Console.WriteLine("Failed to call RegisterClasEx, error = {0}", message);
            }

            IntPtr hwnd = CreateWindowEx(WindowStylesEx.WS_EX_CLIENTEDGE, wcx.lpszClassName, "Learn to Program Windows", WindowStyles.WS_BORDER, 0, 0, 200, 200, IntPtr.Zero, IntPtr.Zero, hinstance, IntPtr.Zero);
            string message2 = new Win32Exception(Marshal.GetLastWin32Error()).Message;

            return hwnd;
        } 

В итоге получаю какю то непонятную ошибку при регистрации класса окна.

У меня программа 64 битная.
Может быть тут так не работает?? Хотя пример вроде аналогичен тому что в мсдн дают.

Может кто знает как это побороть??

Так это не ошибка, рет же не 0.

RegisterClassExA function (winuser.h) - Win32 apps | Microsoft Docs

If the function succeeds, the return value is a class atom that uniquely identifies the class being registered. This atom can only be used by the CreateWindow, CreateWindowEx, …

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Ну а почему он тогда при создании окна возвращает нулевой указатель и говорит что класс окна не найден.

У меня работает код отсюда CreateWindowEx and RegisterClass C# - Stack Overflow

А зачем это понадобилось?)

Ну очередной костыль.

Есть в DShow функция отображения свойств:

       internal static void DisplayPropertyPage(IBaseFilter filter, IntPtr parentHandle)
        {
            int hr = filter.QueryFilterInfo(out FilterInfo info);
            DsError.ThrowExceptionForHR(hr);
            if (!(filter is ISpecifyPropertyPages propertyPages))
            {
                throw new ApplicationException("IBaseFilter doesn't implement ISpecifyPropertyPages");
            }
            hr = propertyPages.GetPages(out DsCAUUID pages);
            DsError.ThrowExceptionForHR(hr);
            IBaseFilter[] filters = new IBaseFilter[1];
            filters[0] = filter;
            hr = OleCreatePropertyFrame(parentHandle, 1000, 1000, info.achName, 1, filters, pages.cElems, pages.pElems, Guid.Empty, 0, IntPtr.Zero);
            Marshal.FreeCoTaskMem(pages.pElems);
            DsError.ThrowExceptionForHR(hr);
        }

И эта штука создает отдельное окно. Но мне нужно чтобы этот фукционал был в теле моей формы в приложении. Parent он не принимает. положение XY тоже … на одном форуме вычитал что можно создать новое окно за пределами экрана и передать парента на него, тогда окно свойств отобразится там. И затем через винапи я меняю руками парента и вывожу панель управления уже в своей форме.

А сейчас после создания окна свойств оно отображается на экране а потом перескакивает на форму приложения моего. Визуально это выглядит не очень красиво.

Более изящного решения я увы не нашел.