将ToolWindow引入应用程序的前端

时间:2015-05-17 11:45:48

标签: vb.net vba

基本上,在我的代码中,我将表单转换为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()

来自https://social.msdn.microsoft.com/Forums/vstudio/en-US/d6c2b85c-3a48-48f7-a9f6-a68ea4ef0441/how-to-get-access-to-my-toolwindowpane-object-with-an-ivswindowframe-pointer?forum=vsx

任何帮助找到表格的IVsUIShell或对此代码的解释都将非常感谢!

我还尝试过将实际表单设置为IVsWindowFrame这样简单的事情:

Dim windowFrame As IVsWindowFrame = CType(Me, IVsWindowFrame)
windowFrame.Show()

但它引发了一个例外:

type 'RifleSystem.scrSettings' to type 'Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame'.

顺便说一句,如果有帮助的话,我正在运行64位VS2013。

1 个答案:

答案 0 :(得分:0)

好吧我现在觉得很蠢。有一个属性Form.Owner,它完全符合我在这个场景中所需要的,它完美无缺!不需要所有这些令人费解的东西:D

以下是有关人员感兴趣的链接:

https://msdn.microsoft.com/en-us/library/system.windows.forms.form.owner%28v=vs.110%29.aspx