2

特定のクラス タイプ ("VSDebugger CDataTipWnd") でウィンドウを作成しようとしていますが、CreateWindowEx を実行すると失敗し、GetLastError によってクラスが見つからないことが通知されます。参照用のコードは次のとおりですが、重要ではありません。

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++ を使用して確認しました) が、このタイプのウィンドウを自分で作成しようとすると、動作せず、理由がわかりません。

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

ありがとう!ヴィタリー

4

2 に答える 2

2

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

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

メインの EXE がクラスを登録したと思われる場合は、GetModuleHandle(IntPtr.Zero) を介してその HINSTANCE を取得できます。

別の DLL がクラスを登録した場合、どの DLL かを知り、その HINSTANCE/HMODULE を取得する何らかの方法が必要になります (最近では 2 つは同じです)。

于 2010-12-07T00:04:38.383 に答える
1

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

于 2010-12-06T22:17:53.140 に答える