将窗口句柄(HWND)绑定到非托管代码中的类名/组件类型

时间:2010-12-14 15:53:56

标签: c++-cli unmanaged hwnd


我想知道一个窗口的顶层组件名称,因为它知道它的窗口句柄 这是在托管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 个答案:

答案 0 :(得分:1)

这可能是WinForms代码正在做的事情:

  1. 创建窗口时,使用SetWindowLongPtr (handle, GWL_USERDATA, value)存储对拥有窗口的对象的引用。
  2. Control :: FromHandle调用GetWindowLongPtr (handle, GWL_USERDATA)来检索托管对象引用,然后您可以使用(GetType()等)管理对象
  3. 要在本机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 ();
    }