user-0 提问: 创建窗口时指定实例句柄有什么用？

回复:
user: user-1
content: 使用Spy++可以查看所有窗口的从属关系。

user: user-0
content: 引用 1 楼 赵4老师 的回复:因为不同的实例句柄可以拥有同一个窗口？ 如果指定实例句柄为NULL，那么窗口是归注册该窗口类的实例所有吗？我用BUTTON类创建一个窗口，自己是仍然可以检测到窗口的消息的，请问这是怎么回事？

user: user-2
content: 创建窗口的函数CreateWindow()的倒数第二个参数hInstance，其类型为HINSTANCE，即实例句柄类型。该参数的含义是 A handle to the instance of the module to be associated with the window. 与创建的窗口相关联的模块实例的句柄。该函数的参数实际上来自入口函数WinMain()的第一个参数，该参数的含义是 第一个参数hInstance表示该程序当前运行的实例的句柄，这是一个数值。当程序在Windows下运行时，它唯一标识运行中的实例（注意，只有运行中的程序实例，才有实例句柄）。一个应用程序可以运行多个实例，每运行一个实例，系统都会给该实例分配一个句柄值，并通过hInstance参数传递给WinMain函数。 hInstance是区分一个应用程序的多个实例的。

user: user-3
content: 引用 3 楼 六道佩恩 的回复:[quote=引用 2 楼 user-3 的回复:] 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？[/quote]  是的,不然操作系统不知道要把消息派发给哪个实例

user: user-0
content: 引用 12 楼 user-3 的回复:貌似win32下,这个值意义不大了,因为系统不需要用这个来区分一个应用程序的多个实例  也就是说平时设为NULL就可以了吗？ 也就是说，像创建BUTTON窗口这种，系统也是知道我们的我们的实例句柄的是吧？ 那么，其他实例注册的类，我们用的时候实例句柄设为NULL也没问题吗？ 抱歉，我的问题有点多，我主要就是想搞清楚

user: user-3
content: 引用 11 楼 六道佩恩 的回复:[quote=引用 9 楼 user-3 的回复:] 可能只运行了你这个app的一个实例把 这里有篇文章 https://blog.csdn.net/ljabclj/article/details/42520065 这篇文章我看过，当时只注意到注册全局类哪里，现在看的话，好像跟我们说的有点出入啊，文章里说的指定实例句柄是用来找到窗口类，但刚才我们说的是窗口归哪个实例所有啊，，，，而且我刚刚的问题是，，这个BUTTON应该是系统的实例所注册的类，而我用BUTTON创建窗口未指定实例句柄的话，那这个窗口岂不是归系统实例所有？[/quote]  貌似win32下,这个值意义不大了,因为系统不需要用这个来区分一个应用程序的多个实例

user: user-0
content: 引用 9 楼 user-3 的回复:可能只运行了你这个app的一个实例把 这里有篇文章 https://blog.csdn.net/ljabclj/article/details/42520065 这篇文章我看过，当时只注意到注册全局类哪里，现在看的话，好像跟我们说的有点出入啊，文章里说的指定实例句柄是用来找到窗口类，但刚才我们说的是窗口归哪个实例所有啊，，，，而且我刚刚的问题是，，这个BUTTON应该是系统的实例所注册的类，而我用BUTTON创建窗口未指定实例句柄的话，那这个窗口岂不是归系统实例所有？

user: user-3
content: 也有这样的回答 引用HINSTANCE是exe映像的虚拟地址，HINSTANCE用于区分进程实例仅限于没有隔离进程地址空间的16位windows，现在的windows每个进程有自己的地址空间，两个进程的同一个地址可以是不同的东西，此时HINSTANCE不再具有唯一标识运行中的实例的功能

user: user-3
content: 引用 8 楼 六道佩恩 的回复:[quote=引用 7 楼 user-3 的回复:] [quote=引用 6 楼 六道佩恩 的回复:] [quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 六道佩恩 的回复:] [quote=引用 2 楼 user-3 的回复:] 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？[/quote]  是的,不然操作系统不知道要把消息派发给哪个实例[/quote]  用系统控件类创建一个窗口，instance指定为NULL，为什么也能收到消息？按理说这是系统注册的呀[/quote]  你创建的是自己的窗口上的子窗口吗[/quote] 子窗口和非子窗口都试过 比如CreateWindow（“BUTTON”，“ABC”，0,0,0,0,0，NULL，NULL，NULL， NULL）这样直接创造一个只有按钮的重叠窗口，或者指定控制台窗口为父窗口，这样也都是可以获取到消息的，但是我没指定实例句柄[/quote]  可能只运行了你这个app的一个实例把 这里有篇文章 https://blog.csdn.net/ljabclj/article/details/42520065

user: user-0
content: 引用 7 楼 user-3 的回复:[quote=引用 6 楼 六道佩恩 的回复:] [quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 六道佩恩 的回复:] [quote=引用 2 楼 user-3 的回复:] 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？[/quote]  是的,不然操作系统不知道要把消息派发给哪个实例[/quote]  用系统控件类创建一个窗口，instance指定为NULL，为什么也能收到消息？按理说这是系统注册的呀[/quote]  你创建的是自己的窗口上的子窗口吗[/quote] 子窗口和非子窗口都试过 比如CreateWindow（“BUTTON”，“ABC”，0,0,0,0,0，NULL，NULL，NULL， NULL）这样直接创造一个只有按钮的重叠窗口，或者指定控制台窗口为父窗口，这样也都是可以获取到消息的，但是我没指定实例句柄

user: user-3
content: 引用 6 楼 六道佩恩 的回复:[quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 六道佩恩 的回复:] [quote=引用 2 楼 user-3 的回复:] 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？[/quote]  是的,不然操作系统不知道要把消息派发给哪个实例[/quote]  用系统控件类创建一个窗口，instance指定为NULL，为什么也能收到消息？按理说这是系统注册的呀[/quote]  你创建的是自己的窗口上的子窗口吗

user: user-0
content: 引用 4 楼 user-3 的回复:[quote=引用 3 楼 六道佩恩 的回复:] [quote=引用 2 楼 user-3 的回复:] 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？[/quote]  是的,不然操作系统不知道要把消息派发给哪个实例[/quote]  用系统控件类创建一个窗口，instance指定为NULL，为什么也能收到消息？按理说这是系统注册的呀

user: user-1
content: 因为不同的实例句柄可以拥有同一个窗口？

user: user-0
content: 引用 2 楼 user-3 的回复:一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？

user: user-3
content: 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄