【问题标题】:How do I obtain the HINSTANCE for the CreateWindowEX function when using it outside of WinMain?在 WinMain 之外使用 CreateWindowEX 函数时,如何获取其 HINSTANCE?
【发布时间】:2014-10-10 01:59:49
【问题描述】:

当我单击主窗口上的按钮时,我试图创建一个弹出窗口,为此我使用了 CreateWindowEX 函数。但是,CreateWindowEx 函数接收 HINSTANCE 类型变量作为其倒数第二个参数。鉴于我在单击按钮时从 WndProcedure 内部创建了这个新窗口,WinMain 函数中的 HINSTANCE 变量对我来说将不可用,因为它不是全局变量。

以下代码是从 WndProcedure 回调函数中获取的:

            case IDC_BUTTON PRESSED:
            {

                const char g_szClassName2[] = "POPWIND";
                const char WndName2[] = "POPUP WINDOW";

                HWND invisWindowHandle = CreateWindowEx(0,
                      g_szClassName2,
                      WndName2,
                      WS_OVERLAPPEDWINDOW,
                      200,
                      200,
                      800,
                      500,
                      NULL,
                      NULL,
                      hInstance,//THIS IS THE VARIABLE I AM HAVING TROUBLE GETTING
                      NULL);

                ShowWindow(invisWindowHandle, 3);// SW_SHOWNORMAL);
                UpdateWindow(invisWindowHandle);
             }

如何获取所需的 hInstance 变量,以便 CreateWindowEx 函数在 WndProcedure 回调函数内部工作?

注意:我考虑过将 hInstance 变量设为全局变量,但我不确定我的应用程序创建的每个窗口是否都必须使用相同的 hInstance。

【问题讨论】:

  • 这是一个可选参数(如文档中所述),但如果您真的想要,GetModuleHandle(nullptr)
  • 哦,好吧,你知道加入它有什么好处吗?

标签: c++ window createwindowex


【解决方案1】:

winapi 带有一些从 Windows 版本 1 到 3 继承的包袱。它们使用协作多任务,运行相同的“任务”是通过使用相同的程序并传递不同的 hInstance 值来实现的。将多任务 GUI 操作系统塞入 640 KB RAM 的重要技巧。

这在 21 年前随着 Windows NT 的发布而不再相关,紧随其后的是 Windows 95。首先支持进程概念的 Windows 版本。安全和系统稳定性的一个重要概念,运行程序之间有非常强的隔离。因此,HINSTANCE 的相关性消失了,每个进程都获得相同的值。 伪句柄。 HMODULE 也差不多,只是内存中加载模块的地址。

因此,为 hInstance 参数传递 NULL 是可以的。它的意思是“当前进程”,你不能为另一个进程创建一个窗口。并且将您从 WinMain() 获得的 hInstance 存储在一个全局变量中也很好,只有一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2022-08-17
    • 2018-05-27
    相关资源
    最近更新 更多