Vb.net Microsoft word在后台打开

Vb.net Microsoft word在后台打开,vb.net,ms-word,operating-system,Vb.net,Ms Word,Operating System,我有一个在Windows7上用VB.net编写的应用程序,可以打开word文档并在其中插入一些值。这很好,但在我客户的机器上(开发很好),Word正在我的应用程序后面打开。我已经尝试在代码中最大化文档,但它仍然在客户端机器上打开我的应用程序。有人知道我该怎么解决这个问题吗 我已经尝试过的事情: 在我的应用程序中最大化word 在我的应用程序中关注word 我已经确保补丁是最新的 我对办公室进行了维修 您是否尝试过最小化应用程序,而不是最大化文档 Me.WindowState=FormWindo

我有一个在Windows7上用VB.net编写的应用程序,可以打开word文档并在其中插入一些值。这很好,但在我客户的机器上(开发很好),Word正在我的应用程序后面打开。我已经尝试在代码中最大化文档,但它仍然在客户端机器上打开我的应用程序。有人知道我该怎么解决这个问题吗

我已经尝试过的事情:

  • 在我的应用程序中最大化word
  • 在我的应用程序中关注word
  • 我已经确保补丁是最新的
  • 我对办公室进行了维修

您是否尝试过最小化应用程序,而不是最大化文档


Me.WindowState=FormWindowState.Minimized
将最小化调用它的表单(假设您使用的是表单应用程序)

您是否尝试过最小化应用程序,而不是最大化文档


Me.WindowState=FormWindowState.Minimized
将最小化调用它的表单(假设您使用的是表单应用程序)

你可能需要把这个词带到最前沿。这与将应用程序中的表单带到顶部有点不同

您需要有对两个API的引用,FindWindowSetWindowPos——第一个API可以找到另一个正在运行的应用程序的windows句柄,第二个API向操作系统发送一条消息以给出应用程序焦点(它使用FindWindow提供的windows句柄)

下面是一些示例代码

Public Class Form1

    <Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True, CharSet:=Runtime.InteropServices.CharSet.Auto)> _
    Private Shared Function FindWindow(ByVal lpClassName As String, _
                                       ByVal lpWindowName As String) As IntPtr
    End Function

    <Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
    End Function

    Private Shared ReadOnly HWND_TOPMOST As New IntPtr(-1)
    Private Shared ReadOnly HWND_NOTOPMOST As New IntPtr(-2)

    Private Const SWP_NOSIZE As Integer = &H1
    Private Const SWP_NOMOVE As Integer = &H2

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Shell("calc.exe")
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Dim myHandle As IntPtr = FindWindow(Nothing, "Calculator")

        SetWindowPos(myHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
        SetWindowPos(myHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)

    End Sub

End Class
公共类表单1
_
私有共享函数FindWindow(ByVal lpClassName作为字符串_
ByVal lpWindowName(作为字符串)作为IntPtr
端函数
_
专用共享函数SetWindowPos(ByVal hWnd作为IntPtr,ByVal HwnInsertafter作为IntPtr,ByVal X作为整数,ByVal Y作为整数,ByVal cx作为整数,ByVal cy作为整数,ByVal uFlags作为整数)作为布尔值
端函数
私有共享只读HWND_最顶层作为新IntPtr(-1)
私有共享只读HWND_NOTOPMOST作为新IntPtr(-2)
私有常量SWP_NOSIZE为整数=&H1
私有常量SWP_NOMOVE为整数=&H2
私有子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
Shell(“calc.exe”)
端接头
私有子按钮2\u单击(发送者作为对象,e作为事件参数)处理按钮2。单击
将myHandle变暗为IntPtr=FindWindow(无,“计算器”)
设置窗口位置(myHandle、HWND_TOPMOST、0、0、0、SWP_NOMOVE或SWP_NOSIZE)
设置窗口位置(myHandle、HWND_NOTOPMOST、0、0、0、SWP_NOMOVE或SWP_NOSIZE)
端接头
末级

单击第一个按钮将实例化计算器的副本,第二个按钮将使其位于最顶端,然后将其设置回正常状态。。。因此,它仍然是最重要的表单,但用户也可以激活其他窗口。

您可能需要将Word推向最前沿。这与将应用程序中的表单带到顶部有点不同

您需要有对两个API的引用,FindWindowSetWindowPos——第一个API可以找到另一个正在运行的应用程序的windows句柄,第二个API向操作系统发送一条消息以给出应用程序焦点(它使用FindWindow提供的windows句柄)

下面是一些示例代码

Public Class Form1

    <Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True, CharSet:=Runtime.InteropServices.CharSet.Auto)> _
    Private Shared Function FindWindow(ByVal lpClassName As String, _
                                       ByVal lpWindowName As String) As IntPtr
    End Function

    <Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
    End Function

    Private Shared ReadOnly HWND_TOPMOST As New IntPtr(-1)
    Private Shared ReadOnly HWND_NOTOPMOST As New IntPtr(-2)

    Private Const SWP_NOSIZE As Integer = &H1
    Private Const SWP_NOMOVE As Integer = &H2

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Shell("calc.exe")
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Dim myHandle As IntPtr = FindWindow(Nothing, "Calculator")

        SetWindowPos(myHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
        SetWindowPos(myHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)

    End Sub

End Class
公共类表单1
_
私有共享函数FindWindow(ByVal lpClassName作为字符串_
ByVal lpWindowName(作为字符串)作为IntPtr
端函数
_
专用共享函数SetWindowPos(ByVal hWnd作为IntPtr,ByVal HwnInsertafter作为IntPtr,ByVal X作为整数,ByVal Y作为整数,ByVal cx作为整数,ByVal cy作为整数,ByVal uFlags作为整数)作为布尔值
端函数
私有共享只读HWND_最顶层作为新IntPtr(-1)
私有共享只读HWND_NOTOPMOST作为新IntPtr(-2)
私有常量SWP_NOSIZE为整数=&H1
私有常量SWP_NOMOVE为整数=&H2
私有子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
Shell(“calc.exe”)
端接头
私有子按钮2\u单击(发送者作为对象,e作为事件参数)处理按钮2。单击
将myHandle变暗为IntPtr=FindWindow(无,“计算器”)
设置窗口位置(myHandle、HWND_TOPMOST、0、0、0、SWP_NOMOVE或SWP_NOSIZE)
设置窗口位置(myHandle、HWND_NOTOPMOST、0、0、0、SWP_NOMOVE或SWP_NOSIZE)
端接头
末级

单击第一个按钮将实例化计算器的副本,第二个按钮将使其位于最顶端,然后将其设置回正常状态。。。因此,它仍然是顶部表单,但用户也可以激活其他窗口。

这不是答案。这充其量只是对原始问题的评论。答案应该包含足够的信息在这里是自给自足的,与任何链接作为额外的参考使用。(如果由于某种原因无法访问非现场位置,并且无法在此搜索其内容,则您的答案将毫无意义。)这些页面提供了关于答案应包含哪些内容的更多详细信息。谢谢,很抱歉。添加了更多的细节,希望这是正确的方向。我试图遵循本文中的示例,但它是为VB6编写的。我正在使用Visual Studio 2012和.net 4.0框架。这不是答案。这充其量只是对原始问题的评论。答案应该包含足够的信息在这里是自给自足的,与任何链接作为额外的参考使用。(如果由于某种原因无法访问非现场位置,并且无法在此搜索其内容,则您的答案将毫无意义。)这些页面提供了关于答案应包含哪些内容的更多详细信息。谢谢,很抱歉。添加了更多的细节,希望这是正确的方向。我试图遵循本文中的示例,但它是为VB6编写的。我正在使用Visual Studio