CreateWindowEx将以ERROR_CANNOT_FIND_WND_CLASS失败

我想创build一个窗口与某个类的types(“VSDebugger CDataTipWnd”),但是,当我运行CreateWindowEx它失败,GetLastError告诉我,该类没有find。 这里是供参考的代码,尽pipe它不重要:

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); 

我在这个过程中作为一个插件运行,我知道这个类的一个窗口是在创build之前(我确信使用Winspector / Spy ++),但是当我尝试创build一个这种types的窗口时,不工作,我不明白为什么。

该文档说,“类名称可以是注册RegisterClass或RegisterClassEx的任何名称,只要注册该类的模块也是创build该窗口的模块。类名称也可以是任何预定义的系统类名称。有关系统类名称的列表,请参阅“备注”部分。“ 是否有可能在另一个模块(dll / exe)中创build了RegisterClass? 在另一个模块中创build一个类是否会使其他模块的名称无法访问? 如果是的话,我还能不能find那个class级,并用它创build一个窗口?

谢谢! 维塔利

您将IntPtr.Zero传递给HINSTANCE参数。

注册该类的模块(EXE或DLL)的HINSTANCE必须提供给CreateWindowEx。

如果你认为主EXE注册了类,那么你可以通过GetmoduleeHandle(IntPtr.Zero)来获得它的HINSTANCE。

如果另一个DLL注册了这个类,那么你将需要一些方法来知道哪一个获得了它的HINSTANCE / HMODULE(这两个是相同的)。

可能是这样的。 程序是否提供了一个API来做到这一点? 你提到你是作为一个插件运行 – 我认为这将是做到这一点。