我正在编写一个需要表单句柄的类,但是有一种方法可以在不将其作为参数发送到类构造函数或属性中的情况下使用它?
我知道在表单完全加载之前不会设置处理程序,所以这也是另一个问题。
基本思想是捕获表单句柄而不将其作为参数传递并处理 wm 消息。
目前尚不清楚“表单句柄”(表单对象本身还是 Form.Handle 属性?)是什么意思。
但是,您可以使用My.Application.OpenForms集合(请参阅此处)循环所有打开的表单并找到您需要知道其标题或名称的表单
Private Function GetFormByTitle(title as String) as Form
Dim result As Form
For Each f As Form In My.Application.OpenForms
if f.Text = title then
result = f
Exit For
End If
Next
Return result
End Function
然后,您可以使用此方法的结果来获取已识别表单的“句柄”:
Dim h as IntPtr
Dim f as Form
f = GetFormByTitle("Caption_Of_Form")
if f IsNot Nothing then
h = f.Handle
' .... do your work with handle here
End if
最后我找到了适合我需要的解决方案。
http://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.createhandle.aspx
这允许我创建一个“幽灵窗口”并在运行时获取它的处理程序,而无需修改我的类或在构造函数或属性中传递处理程序。
需要的另一件事是处理 WM,这也解决了问题。
请注意,WM 和表单处理程序属于“幽灵窗口”,而不是承载界面的表单。