user-0 提问: 实例句柄真的有用吗？

回复:
user: user-0
content: 引用 11 楼 幻夢之葉 的回复:Type: HINSTANCE  A handle to the instance of the module to be associated with the window.  lpParam [in, optional] Type: LPVOID  A pointer to a value to be passed to the window through the CREATESTRUCT structure (lpCreateParams member) pointed to by the lParam param of the WM_CREATE message. This message is sent to the created window by this function before it returns.  If an application calls CreateWindow to create a MDI client window, lpParam should point to a CLIENTCREATESTRUCT structure. If an MDI client window calls CreateWindow to create an MDI child window, lpParam should point to a MDICREATESTRUCT structure. lpParam may be NULL if no additional data is needed. 还是懵逼呀，不知道这段讲的什么，是说实例句柄这个参数会作为一个结构体的成员传值到lParam？

user: user-1
content: Type: HINSTANCE  A handle to the instance of the module to be associated with the window.  lpParam [in, optional] Type: LPVOID  A pointer to a value to be passed to the window through the CREATESTRUCT structure (lpCreateParams member) pointed to by the lParam param of the WM_CREATE message. This message is sent to the created window by this function before it returns.  If an application calls CreateWindow to create a MDI client window, lpParam should point to a CLIENTCREATESTRUCT structure. If an MDI client window calls CreateWindow to create an MDI child window, lpParam should point to a MDICREATESTRUCT structure. lpParam may be NULL if no additional data is needed.

user: user-2
content: 刚查了以下MSND 不知道什么时候开始，CreateWindow(Ex)的 hInstance 参数已经变成可选的了。 NT/2000/XP以上被忽略 HWND WINAPI CreateWindow(   _In_opt_ LPCTSTR   lpClassName,   _In_opt_ LPCTSTR   lpWindowName,   _In_     DWORD     dwStyle,   _In_     int       x,   _In_     int       y,   _In_     int       nWidth,   _In_     int       nHeight,   _In_opt_ HWND      hWndParent,   _In_opt_ HMENU     hMenu,   _In_opt_ HINSTANCE hInstance,   _In_opt_ LPVOID    lpParam ); HWND WINAPI CreateWindowEx(   _In_     DWORD     dwExStyle,   _In_opt_ LPCTSTR   lpClassName,   _In_opt_ LPCTSTR   lpWindowName,   _In_     DWORD     dwStyle,   _In_     int       x,   _In_     int       y,   _In_     int       nWidth,   _In_     int       nHeight,   _In_opt_ HWND      hWndParent,   _In_opt_ HMENU     hMenu,   _In_opt_ HINSTANCE hInstance,   _In_opt_ LPVOID    lpParam );

user: user-2
content: 这里的属于是归属于，是指注册在谁的名下，你的程序创建了窗口并且有消息循环当然可以收消息 就比如系统的edit控件是注册在系统名下的，你的程序创建了输入框edit照样可以收到消息

user: user-3
content: 类似访问资源的api需要用到实例句柄，比如dll里面调用FindResource，就必须用dll的句柄，不能像exe一样直接用null

user: user-0
content: 引用 7 楼 Intel0011 的回复:这里的属于是归属于，是指注册在谁的名下，你的程序创建了窗口并且有消息循环当然可以收消息 就比如系统的edit控件是注册在系统名下的，你的程序创建了输入框edit照样可以收到消息 有几个问题，控件类之所以我们注册在其他地方而我们能用是因为它是全局的吧，我们注册的类不是全局的，如果注册在别的实例的名下，理应是不能用的呀。 还有就是，创建窗口也有指定实例句柄，不可能创建在别的实例的名下我们的实例也能接收到它的消息？ 最后一点就是，请问“参数可选”你是怎么看出来的？我看的上面只有说“要与窗口关联的模块实例的句柄”这么一句。

user: user-0
content: 如果属于桌面，那么我这个线程就理应接收不到这个窗口的消息了呀，但实测能接收到

user: user-2
content: 如果设为NULL，表示窗口和窗口类属于桌面，不是属于你创建的实例程序

user: user-0
content: 引用 3 楼 耕者走兔 的回复:这里的 NULL 指的是默认句柄。默认和没有是两回事。 你确定吗？MSDN对于这两个函数的实例句柄一点没有这个说明呀。

user: user-4
content: 这里的 NULL 指的是默认句柄。默认和没有是两回事。

user: user-0
content: 引用 1 楼 幻夢之葉 的回复:你怎么设为NULL的？ 句柄应该是操作系统内核返回的，不能用户指定吧？如果能指定，只能指定窗口的父句柄，或者它使用到的资源的句柄（其他对象的） CreateWindow创建窗口、RegisterClass注册窗口类，这些不都要指定实例句柄吗？

user: user-1
content: 你怎么设为NULL的？ 句柄应该是操作系统内核返回的，不能用户指定吧？如果能指定，只能指定窗口的父句柄，或者它使用到的资源的句柄（其他对象的）