2010-12-06 3 views
2

特定のクラスタイプ( "VSDebugger CDataTipWnd")のウィンドウを作成しようとしていますが、CreateWindowExを実行すると失敗し、GetLastErrorはクラスが見つからないことを通知します。それは問題ないはずのにここで参照のためのコードは、次のとおりです。CreateWindowExがERROR_CANNOT_FIND_WND_CLASSで失敗する

const Win32WindowStyles dwStyle = Win32WindowStyles.WS_POPUP; 
IntPtr wnd = NativeMethods.CreateWindowEx(0L, "VSDebugger CDataTipWnd", "MyWindow", 
                dwStyle, 100, 100, 100, 100, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); 

私は、プロセスにプラグインとして動作していると私は、私はそのことを確実なものとした(前にこのクラスのウィンドウが作成されることを知っていますWinspector/Spy ++を使用しています)、このタイプのウィンドウを自分で作成しようとすると、うまく動作せず、理由がわかりません。

documentationには、「クラス名は、RegisterClassまたはRegisterClassExで登録された任意の名前です。ただし、クラスを登録するモジュールもウィンドウを作成するモジュールである必要があります。クラス名は、事前定義済みのシステムクラス名のリストについては、「備考」を参照してください。 RegisterClassが実際に別のモジュール(dll/exe)で作成された可能性はありますか?別のモジュールにクラスを作成するだけで、別のモジュールの名前でアクセスできなくなるのですか?もしそうなら、私はまだ何とかそのクラスを見つけてそれを使ってウィンドウを作成できますか?

ありがとうございます! Vitaly

答えて

2

IntPtr.ZeroをHINSTANCE引数に渡します。

クラスを登録したモジュール(EXEまたはDLL)のHINSTANCEをCreateWindowExに提供する必要があります。

メインのEXEがクラスを登録したと思えば、GetModuleHandle(IntPtr.Zero)でHINSTANCEを取得できます。

別のDLLでクラスが登録されている場合は、どのクラスかを知り、HINSTANCE/HMODULEを取得する必要があります(これらの2つは最近同じです)。

+0

右に感謝、ありがとう!やってみます。 – VitalyB

+0

GetModuleHandle(null)を使用しても動作していないようです...私はすべてのモジュールを列挙し、正しいものを見つけようとします。もっと良い方法はありませんか?どのモジュールがクラスXを作成したのかを確認するのと同じですか? – VitalyB

+1

ウィンドウクラスのインスタンスが画面に表示されている場合は、Visual Studioに付属のSpy ++ツールを使用してそのウィンドウを探します(その上に十字線をドラッグして見つけることができます)。タブをクリックすると、インスタンスハンドルが表示されます。プロセスエクスプローラに切り替えてプロセスを選択し、DLLビュー(下のパネル)をオンにすると、Base列に同じ番号が表示されているDLLになります。 (プロセスエクスプローラは数字を埋めるわけではないので、0x600000は0x6000000などと簡単に混同されます)コードでは、そのDLLのLoadLibraryをハンドル用に試してください –

1

これはおそらくそうです。プログラムはこれを行うためのAPIを提供していますか?あなたはあなたがプラグインとしてそれを実行していると言います - 私はそれがそれを行う方法だと思います。

+0

私は恐れていません...私は違ったやり方をあきらめてこの道を行くだけでした。 – VitalyB

関連する問題