我正在尝试创建具有特定类类型的窗口(“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++确认了这一点),但是,当我尝试自己创建此类窗口时,不起作用,我不知道为什么。
documentation表示:“类名可以是在RegisterClass或RegisterClassEx中注册的任何名称,只要注册该类的模块也是创建窗口的模块。该类名也可以是任何预定义的系统类名。有关系统类名称的列表,请参见“备注”部分。”是否可能确实在另一个模块(dll/exe)中创建了RegisterClass?仅在另一个模块中创建类是否会使它无法从另一个模块中按名称访问?如果是这样,我还能以某种方式找到该类并用它创建一个窗口吗?
谢谢!
维塔利
最佳答案
您正在将IntPtr.Zero传递给HINSTANCE参数。
必须将注册该类的模块(EXE或DLL)的HINSTANCE提供给CreateWindowEx。
如果您认为主EXE注册了该类,则可以通过GetModuleHandle(IntPtr.Zero)获得其HINSTANCE。
如果另一个DLL注册了该类,则您将需要某种方式来知道哪个类并获得其HINSTANCE/HMODULE(如今这两个是相同的)。
关于windows - CreateWindowEx失败,并显示ERROR_CANNOT_FIND_WND_CLASS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4371470/