C# 隐藏System.Diagnostics.Process GUI窗口

C# 隐藏System.Diagnostics.Process GUI窗口,c#,winscp,C#,Winscp,我真的在努力解决以下问题。我知道我的场景中也有类似的问题,但没有一个是完全相同的场景 我已经创建了一个SSIS自定义组件,用于启动我希望在静默模式下运行的外部应用程序。无论我尝试什么,gui总是出现。如果我在控制台应用程序中使用相同的代码,我根本不会遇到任何问题。我能看到的SSIS自定义组件(dll)和控制台应用程序之间的唯一区别是,我的组件引用System.Windows.Forms并使用BIDS。我正在使用以下代码。任何我非常愿意尝试的建议 Process winscp = new Proc

我真的在努力解决以下问题。我知道我的场景中也有类似的问题,但没有一个是完全相同的场景

我已经创建了一个SSIS自定义组件,用于启动我希望在静默模式下运行的外部应用程序。无论我尝试什么,gui总是出现。如果我在控制台应用程序中使用相同的代码,我根本不会遇到任何问题。我能看到的SSIS自定义组件(dll)和控制台应用程序之间的唯一区别是,我的组件引用System.Windows.Forms并使用BIDS。我正在使用以下代码。任何我非常愿意尝试的建议

Process winscp = new Process();

winscp.StartInfo.FileName = @stExe;
winscp.StartInfo.Arguments = "/log=";
winscp.StartInfo.UseShellExecute = false;
winscp.StartInfo.RedirectStandardInput = true;
winscp.StartInfo.RedirectStandardOutput = true;
winscp.StartInfo.CreateNoWindow = true; 

winscp.Start();
这是可能的使用。您需要确保方法ShowWindow是在流程窗口创建之后调用的,而不是在其启动期间调用的

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
在进程窗口出现后调用以下命令

ShowWindow(winscp.MainWindowHandle, 0)

尝试查找新进程的窗口,尽快将其隐藏

使用Win32 API

HWND hwnd = FindWindow(NULL, "Title");
ShowWindow(hwnd, SW_HIDE);

在运行WinSCP时:

  • 如果使用
    winscp.com
    CreateNoWindow
    应该可以工作,因为控制台窗口是由系统创建的,因此可以由
    CreateNoWindow
  • 如果使用
    winscp.exe
    CreateNoWindow
    不工作,因为控制台窗口是由winscp本身创建的。但是可以通过省略
    /console
    参数来强制WinSCP不创建窗口
有关详细信息,请参阅:

您是否尝试将设置为?Yep,我已经创建了ProcessStartInfo类的实例。CreateNoWindow只能在控制台模式应用程序上工作,显然这是一个gui应用程序。您只能要求它使用WindowsStyle属性隐藏其窗口。哪些程序经常被忽略。@HansPassant谢谢。我想这可能就是问题所在。有没有其他方法可以绕过它?这不会奏效,这是我在发布之前尝试过的。正如@Hans Passant所指出的,它只适用于控制台应用程序。