문제

startf_useshowwindow 및 sw_hide로 설정된 startup 플래그가있는 CreateProcess ()를 사용하여 창이 숨겨져있는 백그라운드에서 응용 프로그램을 시작하고 있습니다. 예정된 유지 보수 작업을 실행하기 위해이 작업을 수행하고 있으며 Windows를 방해하고 싶지 않습니다.

대부분의 경우 창문은 숨겨져 있지만 프로그램의 창이 당신 앞에서 바로 튀어 나오는 경우가 있습니다 (예 : Google의 크롬 - 다른 앱으로 테스트를 시작하여 한 번 문제인지 확인하기 시작했습니다 ...).

이것은 Windows XP에서는 덜 발생하지만 Vista에서는 많이 발생합니다.

내가 놓친 깃발이 있습니까? 창이 숨겨져있는 프로세스를 만들 수있는 다른 방법이 있습니까?

감사!

내 샘플 코드는 다음과 같습니다.

char *ProgramName  
STARTUPINFO StartupInfoF;
PROCESS_INFORMATION ProcessInfoF;

memset(&StartupInfoF, 0, sizeof(StartupInfoF));
memset(&ProcessInfoF, 0, sizeof(ProcessInfoF));

StartupInfoF.cb = sizeof(StartupInfoF);
StartupInfoF.wShowWindow = SW_HIDE;
StartupInfoF.dwFlags = STARTF_USESHOWWINDOW;    

if (CreateProcess(ProgramName,
                  "",                 
                  0,
                  0,
                  FALSE,
                  DETACHED_PROCESS,
                  0,
                  0,                              
                  &StartupInfoF,
                  &ProcessInfoF) == FALSE)
{
  // error
}
else
{
  // OK
}
도움이 되었습니까?

해결책

CreateProcess로 전달 된 startupinfo 구조의 lpdesktop 멤버를 사용하여 다른 데스크탑에서 프로세스를 시작할 수 있습니다. 이렇게하면 프로세스에 모든 창이 표시되지만 다른 데스크탑에 표시되므로 귀하 (또는 사용자)는 귀찮게하지 않습니다.

나는 여러 데스크탑으로 작업 한 적이 없으므로 부작용이 무엇인지 말할 수는 없지만 가능하다고 생각합니다. 조사하여 시작하십시오 CreadesKtop 그리고 앞으로 움직입니다.

다른 팁

나는 당신의 질문에 대한 답을 기억하지 못하지만, 당신이 창문을 완전히 숨겨서는 안된다고 제안하고 싶습니다. 창문을 벗어나 원한다면 최소화하면 충분합니다. 그것을 숨기면 예정된 유지 보수 작업을 확인하는 기능 만 완전히 제거됩니다.

일부 프로그램은 무시/무시할 수 있습니다 SW_HIDE 깃발. 자식 과정이 시작된 후 창문을 숨길 수 있습니다.

또 다른 옵션은 사용하는 것입니다 CreateProcessAsUser 데스크탑을 분리 한 세션 0에서 프로세스를 실행하려면 (Vista 버전에서 시작).

나는 그것을 서비스로 만드는 것을 제안합니다. 우선, 아무도 로그인하지 않아도 예정된 유지 관리를 실행할 수 있습니다. 다른 사람의 경우 데스크탑에 액세스 할 수 없도록 서비스를 설정하는 것이 매우 쉽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top