Привязать дескриптор окна (HWND) к имени класса / типу компонента в неуправляемом коде - PullRequest
0 голосов
/ 14 декабря 2010


Я хотел бы узнать имя компонента верхнего уровня окна, зная его дескриптор окна.
Это делается так же в управляемом коде 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.

Однако,Я не могу использовать управляемый код для решения, которое мне нужно разработать.
Я пытался использовать GetClassName() в качестве эквивалента, но это просто дает мне WindowsForms10.STATIC. [...] mumbo jumbo:)
Кто-нибудь знает, какэто можно сделать в неуправляемом коде?
Я знаю, что C ++ изначально не предлагает никакой поддержки WinForms, но я надеюсь получить указатель в правильном направлении.Я видел, как это было сделано в некоторых решениях, но не смог заставить мой код работать: (
Заранее спасибо.

1 Ответ

1 голос
/ 14 декабря 2010

Это, вероятно, то, что делает код WinForms:

  1. Когда окно создано, используйте SetWindowLongPtr (handle, GWL_USERDATA, value), чтобы сохранить ссылку на объект, владеющий окном.
  2. Control :: FromHandle вызывает GetWindowLongPtr (handle, GWL_USERDATA), чтобы получить ссылку на управляемый объект, с которой затем можно выполнять управляемые вещи (GetType () и т. Д.)

Чтобы сделать это на собственных Win32 и C ++, создайте интерфейсКласс, как:

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

, а затем получить элементы управления из него:

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

, а затем в конструкторе управления:

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

и, наконец, с учетом окнаручка:

string GetWindowTypeName (HWND handle)
{
  IControl *control = GetWindowLongPtr (handle, GWL_USERDATA);
  return control->GetTypeName ();
}
...