基本上,在我的代码中,我将表单转换为load事件中的工具窗口:
Dim lStyleEx As Long = win32.WS._EX_TOOLWINDOW
Call SetWindowLong(Handle, win32.GWL.__EXSTYLE, CInt(lStyleEx))
Const swpFlags As Long = _
win32.SWP._FRAMECHANGED Or _
win32.SWP._NOMOVE Or _
win32.SWP._NOSIZE Or _
win32.SWP._NOZORDER
Call SetWindowPos(Handle, CType(0, IntPtr), 0, 0, 0, 0, CType(swpFlags, win32.SetWindowPosFlags))
(我的类win32包含所有常量的枚举)
现在,我想通过IVsWindowFrame.Show()将此工具窗口带到前面,但是我无法获取表单的实际IVsWindowFrame。在浏览网页后,我在MSDN论坛上找到了一个片段,但在转换为VBA之后出现了各种问题,例如我不知道如何正确创建新的ServiceProvider:
Dim shell As IVsUIShell = DirectCast(ServiceProvider.GetService(GetType(SVsUIShell)), IVsUIShell)
Dim frame As IVsWindowFrame
Dim guid As New Guid(ToolWindow.GuidList.guidToolWindowPersistanceString)
shell.FindToolWindow(CUInt(__VSFINDTOOLWIN.FTW_fForceCreate), guid, frame)
frame.Show()
任何帮助找到表格的IVsUIShell或对此代码的解释都将非常感谢!
我还尝试过将实际表单设置为IVsWindowFrame这样简单的事情:
Dim windowFrame As IVsWindowFrame = CType(Me, IVsWindowFrame)
windowFrame.Show()
但它引发了一个例外:
type 'RifleSystem.scrSettings' to type 'Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame'.
顺便说一句,如果有帮助的话,我正在运行64位VS2013。
答案 0 :(得分:0)
好吧我现在觉得很蠢。有一个属性Form.Owner,它完全符合我在这个场景中所需要的,它完美无缺!不需要所有这些令人费解的东西:D
以下是有关人员感兴趣的链接:
https://msdn.microsoft.com/en-us/library/system.windows.forms.form.owner%28v=vs.110%29.aspx