C# 在cmd中启动隐藏的windows应用程序而不获取activeWindows状态

C# 在cmd中启动隐藏的windows应用程序而不获取activeWindows状态,c#,vb.net,cmd,C#,Vb.net,Cmd,我有一个Windows窗体应用程序,它使用Forms.WebBrowser。 由于WebBrowser的一个已知问题,在这段时间内会出现增量内存泄漏。 根据之前关于这个问题的建议,我选择使用cmd重新启动应用程序。 但我注意到,即使我启动应用程序最小化,我当前的ActiveWindow也会失去焦点:即,如果我在一个.txt文件上写东西,当应用程序以最小化方式启动时,我会失去对.txt文件的焦点,我被迫停止写东西 这里是我使用的代码 Dim info As New ProcessStartInfo

我有一个Windows窗体应用程序,它使用Forms.WebBrowser。 由于WebBrowser的一个已知问题,在这段时间内会出现增量内存泄漏。 根据之前关于这个问题的建议,我选择使用cmd重新启动应用程序。 但我注意到,即使我启动应用程序最小化,我当前的ActiveWindow也会失去焦点:即,如果我在一个.txt文件上写东西,当应用程序以最小化方式启动时,我会失去对.txt文件的焦点,我被迫停止写东西

这里是我使用的代码

Dim info As New ProcessStartInfo
With info
  .Arguments = "/c " + Chr(34) + Application.ExecutablePath + Chr(34)
  .WindowsStyle = ProcessWindowsStyle.Hidden
  .CreateNoWindow = True
  .FileName = "cmd.exe"
End With
Process.Start(info)
Application.Exit()
我想通过cmd启动该应用程序,而不会将当前活动的windows焦点放在我正在使用的另一个程序上。 我想可能是一个cmd参数。 有什么帮助吗

更新:

经过一些搜索:

我找到了一个调用Windows API的解决方案:

我做了一些测试,使用Windows Api,我可以使用活动窗口获取上一个进程,并将焦点返回到该进程,在重新启动我的应用程序后,将其保留为焦点

但我伸手去做,在ms里等了一会儿

我想在应用程序启动时恢复焦点,但这里应该有一个问题:在我看来,即使我启动应用程序最小化,当应用程序在任务栏上稳定下来,而不是在进程运行时,windows操作系统会将焦点放在任务栏上,如果我正在编写,即在.txt中,我在编写时会失去焦点

我正在做:

启动我的应用程序 做我想最小化的事情,…在桌面上移动,…将应用程序放入 后台正在使用另一个应用程序。。。 在重新启动应用程序之前,我会存储应用程序的当前状态 i、 e.最小化……位置 调用Windows API以检查当前正在运行的进程 作为活动窗口运行,并存储此进程。 调用cmd以使用存储的参数重新启动我的应用程序 等等NB这是我的问题:我可以等几秒钟,但我会的 希望等到重新启动的应用程序出现在任务栏中 在重新启动的应用程序出现在taskBak中之后,我使用Windows 用于恢复上一个活动窗口进程中的焦点的API。 在我重新启动的应用运行时结束我的应用 代码如下:

Private Declare Function GetForegroundWindow Lib "user32.dll" () As Integer
Private Declare Function GetLastActivePopup Lib "user32.dll" (hwnd As IntPtr) As Integer
Private Declare Function SetForegroundWindow Lib "user32.dll" (hwnd As IntPtr) As Integer
Private Declare Function SendMessageW Lib "user32.dll" (hwnd As IntPtr, msg As Integer, wParam As Int32, lParam As Int32) As Boolean
Private Shared WM_SYSCOMMAND As Integer = 274 'select an item from the Window menu
Private Shared SC_RESTORE As Int32 = 6172   'restore the Window
以及:

我现在的问题应该是调用Windows API到任务栏,检查直到有2个我的应用程序启动

有人知道这是不是我的pourposes的好代码吗

如果是,如何将Windows API调用到任务栏以检查当前程序

多谢各位

即使我启动应用程序最小化,我当前的ActiveWindow也会失去焦点

这是因为默认情况下,窗口在显示时激活。可以通过重写

从文件中

如果希望显示顶级窗口,但不希望通过将输入焦点从当前窗口移开而中断用户的工作,请使用此属性

使用此设置可以防止新窗口获得焦点,但不能防止它在活动窗口前弹出。将此与以最小化状态启动表单相结合,可以提供令人满意的体验

一种方法是修改代码,使其包含一个命令行开关,该开关将在显示表单之前设置表单

由于您发布的代码是VB,因此我将展示一个方法,如果您使用的是VB应用程序框架(默认的VB Winform项目模板),则可以使用该方法

从项目菜单中,选择项目属性->应用程序选项卡,然后单击查看应用程序事件按钮

Imports Microsoft.VisualBasic.ApplicationServices

Namespace My
  Partial Friend Class MyApplication
    Private Sub MyApplication_Startup(sender As Object, e As StartupEventArgs) Handles Me.Startup
      If e.CommandLine.Count > 0 AndAlso e.CommandLine.Item(0).Equals("/min", StringComparison.InvariantCultureIgnoreCase) Then
        Application.MainForm = New Form1 With {.NoActivate = True, .WindowState = FormWindowState.Minimized}
      End If
    End Sub
  End Class
End Namespace
其中,表格1包括以下内容:

Public Property NoActivate As Boolean = False

Protected Overrides ReadOnly Property ShowWithoutActivation As Boolean
  Get
    Return NoActivate
  End Get
End Property
您的ProcessInfo代码应该修改为包含命令行开关/min

Const quote As String = """"
With info
    .Arguments = "/c " & quote & Application.ExecutablePath & quote & " /min"
    .WindowStyle = ProcessWindowStyle.Hidden
    .CreateNoWindow = True
    .FileName = "cmd.exe"
End With

好吧,我已经找到了一个答案,它不是正确的,但它解决了问题,现在我的程序运行或多或少我喜欢

我实现了NotifyIcon类的一个实例。 所以,当我最小化应用程序时,我将窗体设置为不可见,它从任务栏隐藏,但显示在任务栏的通知区域。 当我关闭应用程序,并从新应用程序cmd启动另一个应用程序时,首先检查前一个应用程序是否被最小化、隐藏并仅显示在通知区域中。
如果是,它启动的新应用程序将不可见,并且在此模式下,启动新应用程序时,我不会对当前使用的窗口程序失去焦点。

在启动新进程之前,使用GetForegroundWindow Windows API获取焦点窗口,在启动进程之后,使用SetForegroundWindow Windows API将焦点恢复到以前的焦点窗口。首先,可以使用Application.Restart。这样您就不能对文件失去焦点。你这是什么意思?我当前活动的windows集中在另一个程序上意味着什么?如果您正在与另一个进程的窗口交互,则只需调用FindWindow,或使用process.getProcessByName,或保存进程ID并使用process.GetProcessById并使用其MainWindowHandle重新获取句柄。你应该给你的问题提供更多的背景。@MojtabaTajik谢谢你的帮助,我
我正在学习it@Jimi感谢您的帮助,我在开始时尝试了应用程序。重新启动,但我遇到了一个问题,记不清了,似乎进程仍在运行。当我有时间时,我会再试一次。但我认为我的问题与WindowsApi有关,因为这是与活动窗口和任务栏的交互。非常感谢您的帮助,我尝试过,但是。。。它没有给我我想要的东西。如果您尝试在应用程序上运行代码,然后打开一个.txt文件并开始在其上写入,当应用程序在Windows后台重新启动时,您将失去对.txt文件的关注。。。我在研究Windows Api解决方案,就像在那里提出的那样:那里:
Const quote As String = """"
With info
    .Arguments = "/c " & quote & Application.ExecutablePath & quote & " /min"
    .WindowStyle = ProcessWindowStyle.Hidden
    .CreateNoWindow = True
    .FileName = "cmd.exe"
End With