2017-02-13 10 views
-1

Ich registriere eine Klasse über RegisterClassEx, aber nach diesem Schritt erscheint das Fenster nicht mehr.RegisterClassEx in .NET schlägt fehl

Hier ist, wie ich es registrieren:

 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; 

Und hier, wie ich das Fenster erstellen

 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 einen nicht Nullwert zurückgibt. So kann die Registrierung erfolgreich sein. Wo ist die Ursache? Ohne die Ausführung von RegisterClassEx funktioniert es gut, aber ich mag es, etwas wie WndProc Handler zu referenzieren. Irgendwelche Hinweise für mich?

+0

Ich denke, wcx.lpszClassName ist case insensetive, und Sie haben keine Übereinstimmung mit Standard-Windows-Klasse "Edit", aber ich bin mir nicht absolut sicher. – Anton

+0

Versucht es, aber das ist nicht die Ursache. – Kinimod

+0

Ihr Callback-Delegat wird von Ihnen unterbunden. Sie müssen seine Lebensdauer verlängern. –

Antwort

0

"EDIT" ist der Name eines vordefinierten Standards window class (edit control). Sie können es nicht verwenden, um Ihre benutzerdefinierte Fensterklasse zu registrieren, da Klassennamen innerhalb eines Prozesses eindeutig sein müssen. Verwenden Sie stattdessen einen anderen Klassennamen.