http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx
在拥有控件的线程上执行指定的委托 底层窗口句柄。
根据MSDN文章,thread
可以拥有其他句柄。
我最好的猜测是,thread
是一些特殊的超级kernel object
,其他handle
也可以引用handles
吗?
像:
手柄|线程句柄引用
3201 | 20
4882 | 20
4827 | 7
答案 0 :(得分:2)
在这些方面,是的。
基本上,Windows GUI的幕后是一个“消息循环”,它是Windows操作系统(它知道鼠标,键盘和其他输入硬件)和你的程序(它没有'之间的双向通信。需要知道具体细节,但需要根据这些输入设备响应您应用中的用户输入。程序中有一个线程(通常是主程序执行线程),它维护这个循环,监听从Windows进入程序的消息,以及解析消息并将消息传递给各种GUI控件和其他代码对象。这个“GUI消息传递线程”知道并维护对程序中所有GUI对象的所有窗口句柄的引用;它必须,因为如果它没有,它不能传递消息给他们,也不会收听来自他们的消息。
尝试从连接到消息循环的线程外部对GUI控件实例执行某些操作通常是个坏主意。通过这样做,控件所拥有的控件或子控件可以从消息循环中分离出来,或者从不首先附加到消息循环中。然后,“GUI消息线程”不再知道该控件,并且不再向其传递消息。那些控制变得“流氓”;程序和Windows都无法告诉控件移动,重绘或离开。 Windows在此时“控制”窗口所能做的唯一事情就是关闭拥有它的进程,从而终止整个程序。
为了避免这种情况,GUI控件有一个特殊的方法“Invoke”(以及一个异步表兄“BeginInvoke”),用于从GUI消息传递线程外部使用。这些方法基本上通过Windows消息循环从窗口向自身发送消息,导致主GUI线程执行Invoke调用中指定的委托。通过这样做,主GUI线程将知道在该代码内部或由于该代码而创建的任何新GUI对象。
答案 1 :(得分:1)
在自定义线程中创建句柄时,自定义线程可以拥有句柄。实际上我不认为你可以切换手柄的所有者。分享也不可能。
线程可以同时拥有多个句柄。
答案 2 :(得分:0)
每个窗口都由创建窗口的线程拥有。许多窗口操作只能在该线程上执行,因此有一种机制可以确保代码在窗口的线程上执行。
Forms.Invoke就是这样一种机制。