Bind finestra maniglia (HWND) a nome della classe / tipo di componente in codice non gestito

StackOverflow https://stackoverflow.com/questions/4441068

  •  09-10-2019
  •  | 
  •  

Domanda


Vorrei sapere il nome del componente di livello superiore di una finestra dal conoscere la sua maniglia della finestra.
Questo viene fatto in questo modo in codice gestito C ++:

//handle is the window handle as int
System::Windows::Forms::Control^ c = Control::FromHandle((System::IntPtr)System::Convert::ToInt32(handle));
System::Type^ t= c->GetType();
Console::WriteLine(t->FullName);//This is the top level name of the component.

Codice Tuttavia, non posso utilizzare gestito per la soluzione che ho a sviluppare.
Ho cercato di utilizzare GetClassName() come equivalente, ma questo dà solo a me WindowsForms10.STATIC. [...] Mumbo Jumbo :)
Qualcuno ha qualche idea di come questo può essere fatto in codice non gestito?
So che C ++ non nativamente offre alcun supporto per WinForms, ma spero di ottenere un puntatore nel modo giusto. Ho visto fare in alcune soluzioni, ma sono stato in grado di ottenere il mio codice di lavoro :(
Grazie in anticipo.

È stato utile?

Soluzione

Questo è probabilmente ciò che sta facendo il codice WinForms:

  1. Quando si crea una finestra, uso SetWindowLongPtr (handle, GWL_USERDATA, value) per memorizzare un riferimento all'oggetto possedere la finestra.
  2. Il controllo :: FromHandle chiamate GetWindowLongPtr (handle, GWL_USERDATA) per recuperare il riferimento all'oggetto gestito che è quindi possibile fare cose con gestito (GetType (), etc)

Per fare questo in nativo Win32 e C ++, creare una classe di interfaccia, come:

class IControl
{
public:
  virtual const string &GetTypeName () = 0;
};

e controlli poi ne derivano:

class TextBoxControl : public IControl
{
  virtual const string &GetTypeName () { return "TextBox"; }
}

e poi nel costruttore di controllo:

TextBoxControl::TextBoxControl ()
{
   handle = CreateWindowEx (parameters to create a text box);
   SetWindowLongPtr (handle, GWL_USERDATA, this);
}

e, infine, dato un handle di finestra:

string GetWindowTypeName (HWND handle)
{
  IControl *control = GetWindowLongPtr (handle, GWL_USERDATA);
  return control->GetTypeName ();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top