2010-12-14 4 views
0


ウィンドウの最上位レベルのコンポーネント名をウィンドウハンドルから知りたいと思います。
これはそうではマネージドC++コードのように行われます。アンマネージコードのクラス名/コンポーネントタイプへのウィンドウハンドル(HWND)のバインド

//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. [...]のジャンボジャンボを与えます:)
これは管理されていないコードでどのように行うことができますか?
C++はネイティブWinFormsのサポートを提供していませんが、私は正しい方法でポインタを取得したいと考えています。私はそれはいくつかの解決策で行わ見てきましたが、
は、事前にありがとう私のコードは:(作業を取得することができなかった

+0

アンマネージコンポーネントに実際に名前がありますか? – Abyx

+1

'Type'と' FullName'はマネージ世界だけに存在します。あなたが管理されていない世界にそれを公開するマネージコードを書かない限り、これを回避する方法はありません。 –

+0

私が解析しているアプリケーションは、WinFormsを使って.NETで書かれています。私はマネージコードを使用できません。上記のコードスニペットを試してみると、私は実際のクラス名を取得します。 System.Windows.Forms.ComboBox。 GetClassNameは私が特定のコンポーネントタイプに反応する必要があるので、私には使えない質問に書かれているフォーマットしか与えません。 – prettyCode

答えて

1

これは、WinFormsのコードがやっていることはおそらくです:。

  1. ときウィンドウは、作成されたウィンドウを所有するオブジェクトへの参照を格納するのにSetWindowLongPtr (handle, GWL_USERDATA, value)を使用しています。
  2. コントロール:: FromHandleを使用すると、その後、(メソッドGetType()など)を備えたものを管理しないことができ、管理オブジェクト参照を取得するためにGetWindowLongPtr (handle, GWL_USERDATA)を呼び出し
  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(); 
} 
+0

完全な答えをありがとうございました。それは非常に良い解決策です。しかし、私は、私が読んでしようとしているアプリケーションのコードに変更することはできません:((会社のポリシー)GetWindowLongPtrをあなたが示唆したように呼び出そうとしましたが、SetWindowLongPtrが私はControl :: FromHandleがどのように動作し、何かを考案しようとします。 – prettyCode

関連する問題