我想知道一个窗口的顶层组件名称,因为它知道它的窗口句柄
这是在托管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的任何支持,但我希望能以正确的方式获得指针。我已经看到它在一些解决方案中完成,但一直无法使我的代码工作:(
先感谢您。
答案 0 :(得分:1)
这可能是WinForms代码正在做的事情:
SetWindowLongPtr (handle, GWL_USERDATA, value)
存储对拥有窗口的对象的引用。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 ();
}