特定のクラスタイプ( "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
右に感謝、ありがとう!やってみます。 – VitalyB
GetModuleHandle(null)を使用しても動作していないようです...私はすべてのモジュールを列挙し、正しいものを見つけようとします。もっと良い方法はありませんか?どのモジュールがクラスXを作成したのかを確認するのと同じですか? – VitalyB
ウィンドウクラスのインスタンスが画面に表示されている場合は、Visual Studioに付属のSpy ++ツールを使用してそのウィンドウを探します(その上に十字線をドラッグして見つけることができます)。タブをクリックすると、インスタンスハンドルが表示されます。プロセスエクスプローラに切り替えてプロセスを選択し、DLLビュー(下のパネル)をオンにすると、Base列に同じ番号が表示されているDLLになります。 (プロセスエクスプローラは数字を埋めるわけではないので、0x600000は0x6000000などと簡単に混同されます)コードでは、そのDLLのLoadLibraryをハンドル用に試してください –