0


ウィンドウハンドルを知ることで、ウィンドウのトップレベルのコンポーネント名を見つけたいと思います。
これは、マネージ 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.

ただし、開発する必要があるソリューションにマネージ コードを使用することはできません。私は同等のものとして
使用しようとしましたが、これは私にマンボジャンボを与えるだけです:) アンマネージコードでこれを行う方法を知っている人はいますか? C++ がネイティブで WinForms をサポートしていないことはわかっていますが、正しい方法でポインタを取得したいと考えています。いくつかのソリューションでそれが行われているのを見てきましたが、コードを機能させることができませんでした:( よろしくお願いします。 GetClassName()WindowsForms10.STATIC. [...]


4

1 に答える 1

1

これはおそらく、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 ();
}
于 2010-12-14T16:42:53.097 に答える