문제

배경에서 프로세스를 실행하는 명령 줄 또는 .NET 메소드가 열려있는 창을 숨기는 모든 창문이 있습니까?

이미 시도 :

 var process = new Process()
 {
      StartInfo = new ProcessStartInfo()
      {
          CreateNoWindow = true,
          WindowStyle = ProcessWindowStyle.Hidden,
          FileName = TheRealExecutableFileNameHere
      }
 }
 process.Start();

지금까지 성공하지 못했습니다

도움이 되었습니까?

해결책

확인하십시오 MATLAB 엔진.

흥미로운 것도 있습니다 기사 CodeProject 에서이 접근법이 귀하의 요구에 맞는 경우.

다른 팁

나는 내 코드를 검토했고 당신과 거의 동일하게 보입니다.

ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
   CreateNoWindow = true,
   WindowStyle = ProcessWindowStyle.Hidden,
   UseShellExecute = false,
   RedirectStandardOutput = true                                               
};

Process process = Process.Start(psi);

유일한 주목할만한 차이 (서식 및 우리가 선택한 PSI 생성자 외에)는 RAN 프로세스의 결과를 읽어야 할 때 USESHLEXECUTE 및 RESTANDERDAUTPUT를 사용하는 것입니다.

위의 코드가 XP와 Vista에서 숨겨진 프로세스를 지속적으로 실행 한 것을 발견했습니다. 그러나 나는 또한 당신이 동일하게 경험하고있을 수 있습니다. 숨겨진 프로세스는 기본적으로 숨겨지지 않은 다른 프로세스를 시작할 수 있습니다. 다시 말해, 숨겨진 프로세스 A를 시작하고 프로세스 A가 차례로 프로세스 B를 시작하면 프로세스 B가 어떻게 표시되는지에 대한 제어가 없습니다. 통제 할 수없는 창이 표시 될 수 있습니다.

나는 이것이 조금 도움이되기를 바랍니다. 행운을 빕니다.

Microsoft DOS를 사용해 보셨습니까? 시작 명령 /비 스위치?

Microsoft DOS 시작 명령

예를 들어,

START /B cmd.exe

아니요 나는 이것을 달성하는 순수한 .NET 방법을 모른다.

그런 다음 커널에 대해 생각했습니다 작업 대상, 그러나 비슷한 옵션을 찾지 못했습니다 UI 제한.

그래서 다음 (아직 검증되지 않았습니다) 아이디어는 프로세스 중단 된 것보다 생성하는 것입니다. Windows 후크를 만듭니다 그런 다음 모니터링됩니다 CallwndProc WM_SHOW 메시지를 필터링합니다. (그런 다음 분명히 프로세스를 재개하고, 종료 될 때까지 별도의 스레드에서 기다리고 후크를 제거하십시오).

당신은 시도하고 싶을 수도 있습니다 배경 작업자 수업 아직 .NET 프레임 워크에서. UI를 방해하지 않도록 별도의 스레드에서 장기 실행 프로세스를 실행하기위한 것입니다. 봐.

나는 이것이 대답되었음을 알고 있지만, 당신은 FindWindow와 Showwindow에 관리되지 않는 전화로 창문을 숨기도록 강요 할 수 있습니다.

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

psi = new ProcessStartInfo(); // etc..
some_process = Process.Start(psi);
System.Threading.Thread.Sleep(50); // need give the window a chance to be created
IntPtr hWnd = FindWindow(null, "name of the window");
if (hWnd != IntPtr.Zero) ShowWindow(hWnd, 0); // 0 = SW_HIDE

오히려 Kludgy.

애플리케이션을 최소화할지 여부에 따라 다르지만 필요한 경우 사용자와 상호 작용할 수 있거나 발생하는 일에 관계없이 사용자와의 모든 액세스를 금지하려는 경우에 따라 다릅니다.

후자의 경우 현재 사용자와 다른 데스크탑 컨텍스트에서 프로세스를 실행할 수 있습니다.

예를 들어 로그인 대화 상자와 Vista UAC에 의해 다양한 데스크탑 컨텍스트가 사용됩니다. 한 데스크탑 컨텍스트에서 발생하는 모든 것은 다른 데스크탑 컨텍스트와 무관합니다.

그래도 문제에 대한 슬레 즈 해머 접근 방식 일 수 있습니다.

Filename이 Windows 실행 파일을 가리킬 때 CreateNowIndow = False가 절대적으로 아무것도하지 않는 경우 WinForm 앱의 소스 코드에 액세스 할 수 있으면 Winform 앱 시작 코드에서 다음과 같은 일을 형성하고 다음과 같은 작업을 수행하십시오.

static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form1 form1 = new Form1();

        form1.Load += new EventHandler((s,o) =>
            {
              //check if the form should be shown based on command line arg
                if (args.Contains("dontShowWindow"))
                {
                    //hide it
                    form1.ShowInTaskbar = false;
                    form1.Visible = form1.ShowInTaskbar = false;
                }
            }
        );
        Application.Run(form1);
    }

코드를 호출하면 이제 "Dontshowwindow"를 프로세스 인수로 지정할 수 있습니다.

 ProcessStartInfo info = new ProcessStartInfo
        {
            CreateNoWindow = false, 
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false, 
            FileName = @"C:\temp\testWinForm.exe",
            Arguments = "dontShowWindow"
        };
        Process.Start(info);

도움이 되었기를 바랍니다

이를 달성하는 매우 간단한 방법 중 하나는 서비스 계정을 만들고 Windows 작업 스케줄러를 통해 서비스 계정 사용자의 컨텍스트에 따라 실행 파일을 실행하는 것입니다.

이 CodeProject를 사용하여 예정된 작업을 설정할 수 있습니다.

http://www.codeproject.com/kb/cs/tsnewlib.aspx

도메인 또는 로컬 컴퓨터에서 C#을 사용하여 서비스 계정을 프로그래밍 방식으로 만들 수 있습니다.

http://www.codeproject.com/kb/system/osusermangement.aspx http://support.microsoft.com/kb/306273

다른 사용자의 맥락에서 예약 된 작업으로 실행되는 프로세스는 사용자가 로그인하지 않으면 대화식으로 나타나지 않습니다. 따라서 서비스 계정의 사용.

public Form1()
    {
        InitializeComponent();
        Form1 fm = new Form1();
        fm.ShowInTaskbar = false;
        fm.Visible = fm.ShowInTaskbar = false;
    }

잘 작동합니다!

실행 중에 사용자가 보이지 않는 프로세스를 원한다고 가정합니다.

이것이 당신이 원하는 것인지 확인하기 위해 다음을 시도 할 수 있습니다.

  1. 계속 실행되는 간단한 콘솔 앱을 만들고 테스트하도록 시작하십시오.
  2. 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오 -> 속성 -> 응용 프로그램 탭 -> 출력 유형 -> "콘솔 응용 프로그램"에서 Windows 응용 프로그램으로 변경하십시오.
  3. 동일한 앱을 한 번 더 시작하십시오 (이것이 원하는 것인지 확인하십시오).
  4. Windows 작업 관리자를 통해 앱을 닫습니다 :)

작업 관리자에 프로세스가 나타나는 것처럼 보이지만 작업 표시 줄에는 표시되지 않습니다. Alt+Tab 은이 프로세스를 제기 할 수 없습니다.

그래도 악의적 인 앱을 만들지 않기를 바랍니다. :)

나는 당신이 시도하고 싶은 것은 새로운 Windows 스테이션을 만드는 것입니다. MSDN에서 그들에 대해 조금 설명하는이 기사를 확인하십시오.

http://msdn.microsoft.com/en-us/library/ms681928(vs.85).aspx

Windows의 서비스를 만들 수 있습니다. 서비스가 열리려고 시도하는 모든 창은 세션 0에서만 실행됩니다. 즉, 사용자는 볼 수 없습니다. 그것은 모든 창문에 적용되므로 아마도 당신이 찾고있는 것이 아닐 수도 있습니다.

아래 코드는 저를 위해 작동했습니다 : 초기에는 인쇄를 위해 데스크탑 화면에서 메모장을 플래시하는 데 사용되는 프로세스 (메모장)가 사용되었지만 사용자가 산만 해지므로 코드 아래는 메모장 프로세스를 백그라운드에서 숨 깁니다.

                System.Windows.Forms.PrintDialog printDialog = new PrintDialog();
                System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt");
                psi.Verb = "PRINT";

                //Process.Start(psi);
                //psi.CreateNoWindow = true;
                psi.UseShellExecute = false;
                //---------------------------------------------------

                psi.CreateNoWindow = false;
                psi.UseShellExecute = true;
                psi.FileName = Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt";
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                psi.Arguments =  @"%windir%\system32\notepad.exe"; 
                //Process.Start(psi);
                //------------------------------------------------------

                /////////////////////----------------------------------

                printProcess.StartInfo = psi;
                /////psi.CreateNoWindow = true;

                //psi.FileName = "Application.StartupPath" + "/PrintingDocketFile/PrintCustomerOrder.txt";
                //p.StartInfo.FileName = "Notepad.EXE";
                //p.StartInfo.Arguments = "/i /q \"" + installationPackages[i] + "\"";

                printProcess.Start();

                /////////////////////////-------------------------------
                while (!printProcess.HasExited) ;


                if (!printProcess.HasExited)
                {
                    printProcess.Close();
                }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top