2017-02-13 26 views
-1

Я регистрирую класс через RegisterClassEx, но после этого шага окно больше не появляется.RegisterClassEx в .NET не работает

Вот как я зарегистрировать его:

 wcx = new WNDCLASSEX(); 
     wcx.cbSize = Convert.ToUInt32(Marshal.SizeOf(typeof(WNDCLASSEX)));   // size of structure 
     wcx.style = ClassStyles.HorizontalRedraw | ClassStyles.VerticalRedraw; // redraw if size changes 
     wcx.lpfnWndProc = ProcessWndProc;  // points to window procedure 
     wcx.cbClsExtra = 0;    // no extra class memory 
     wcx.cbWndExtra = 0;    // no extra window memory 
     wcx.hInstance = hinstance;   // handle to instance 
     wcx.hIcon = IntPtr.Zero;    // predefined app. icon 
     wcx.hCursor = IntPtr.Zero;     // predefined arrow 
     wcx.hbrBackground = IntPtr.Zero;     // white background brush 
     wcx.lpszMenuName = "MainMenu"; // name of menu resource 
     wcx.lpszClassName = "EDIT"; // name of window class 
     wcx.hIconSm = IntPtr.Zero; 

     // Register the window class. 
     return RegisterClassEx(ref wcx)!=0; 

А вот как я создаю окно

 int wndWidth = hwndRect.Right - hwndRect.Left; 
     int wndHeight = hwndRect.Bottom - hwndRect.Top; 
     Debug.WriteLine("Coord: " + hwndRect.Left.ToString() + "//" + hwndRect.Top.ToString() + "--" + wndWidth.ToString() + "//" + wndHeight.ToString()); 
     hwnd = User32.CreateWindowEx(
      User32.WindowStylesEx.WS_EX_TRANSPARENT 
      | User32.WindowStylesEx.WS_EX_TOPMOST 
      | User32.WindowStylesEx.WS_EX_TOOLWINDOW, 
      wcx.lpszClassName, this.Name, User32.WindowStyles.WS_POPUP | User32.WindowStyles.WS_VISIBLE, 
      hwndRect.Left, hwndRect.Top, wndWidth, wndHeight, IntPtr.Zero, IntPtr.Zero, wcx.hInstance, IntPtr.Zero 
      ); 

     if (hwnd == null) 
      return false; 

RegisterClassEx возвращает не нулевое значение. Таким образом, регистрация может быть успешной. Итак, где причина? Без выполнения RegisterClassEx он отлично работает, но мне нравится настраивать что-то вроде ссылки на WndProc Handler. Какие-нибудь подсказки для меня?

+0

Я думаю, что wcx.lpszClassName не зависит от регистра, и у вас есть несоответствие стандартного класса «Редактировать», но я не совсем уверен. – Anton

+0

Пробовал, но это не причина. – Kinimod

+0

Ваш делегат обратного вызова будет GC'd из-под вас. Вы должны продлить свою жизнь. –

ответ

0

"EDIT" - это предопределенный стандарт window class (edit control). Вы не можете использовать его для регистрации своего пользовательского класса окон, потому что имена классов должны быть уникальными в процессе. Вместо этого используйте другое имя класса.