Windows CreateWindowEx失败,错误为\u找不到\u WND\u类

Windows CreateWindowEx失败,错误为\u找不到\u WND\u类,windows,winapi,createwindow,Windows,Winapi,Createwindow,我试图创建一个具有特定类类型的窗口(“VSDebugger CDATA TIPWND”),但是,当我运行CreateWindowEx时,它失败了,GetLastError告诉我找不到该类。以下是代码供参考,但这并不重要: const Win32WindowStyles dwStyle = Win32WindowStyles.WS_POPUP; IntPtr wnd = NativeMethods.CreateWindowEx(0L, "VSDebugger CDataTipWnd", "MyWi

我试图创建一个具有特定类类型的窗口(“VSDebugger CDATA TIPWND”),但是,当我运行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或RegisterClass的任何名称,前提是注册该类的模块也是创建窗口的模块。类名也可以是任何预定义的系统类名。有关系统类名的列表,请参阅备注部分。”注册表类是否确实是在另一个模块(dll/exe)中创建的?仅仅在另一个模块中创建一个类是否会使它无法从另一个模块通过名称访问??如果是这样,我还能找到那个类并用它创建一个窗口吗

谢谢!
维塔利可能就是这样。程序是否提供了一个API来实现这一点?你提到你是作为它的一个插件运行的——我认为这就是实现它的方法。

你正在将IntPtr.Zero传递给HINSTANCE参数

必须向CreateWindowEx提供注册该类的模块(EXE或DLL)的状态

如果您认为主EXE注册了该类,那么可以通过GetModuleHandle(IntPtr.Zero)获取其HINSTANCE


如果另一个DLL注册了该类,那么您需要一些方法来知道是哪一个,并获取其HINSTANCE/HMODULE(这两个模块现在是一样的)。

恐怕不是。。。我只是在放弃以不同的方式进行操作后才这样做的。使用GetModuleHandle(null)似乎不起作用。。。我想我会尝试列举所有模块并找到正确的模块:|没有更好的方法吗?类似于询问流程哪个模块创建了类X?如果您可以在屏幕上看到窗口类的实例,请使用Visual Studio附带的Spy++工具定位该窗口(您可以将十字线拖动到该窗口上,只需指向它即可找到该窗口),然后查看类选项卡,它将告诉您实例句柄。如果随后切换到Process Explorer,选择该进程并打开DLL视图(下部面板),则该进程应为其基列显示相同编号的DLL。(请注意Process Explorer不会填充数字,因此0x600000很容易与0x6000000等混淆)在您的代码中,请尝试在该DLL上加载库以获取句柄感谢您的帮助!这是一个很好的建议,它确实奏效了。。。我现在可以访问该类(仍然无法用它创建窗口:()。但无论如何,我学到了很多!谢谢!正如MSDN文档中所写,允许为CreateWindowEx的hInstance参数传递空指针(该参数被指定为可选的,所以空指针是可以的)。