2009-07-17 5 views
3

시작 플래그가 STARTF_USESHOWWINDOW 및 SW_HIDE로 설정된 CreateProcess()를 사용하여 백그라운드에서 창을 숨겨서 응용 프로그램을 시작합니다. 예약 된 유지 관리 작업을 실행하기 위해이 작업을하고 있는데 창문에 귀찮게하고 싶지 않습니다.숨겨진 프로세스 만들기 (창 보이지 않음)

대부분의 경우 창은 숨겨져 있지만 프로그램 창의 창이 갑자기 튀어 나오는 경우가 있습니다 (예 : 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 
} 

답변

4

CreateProcess로 전달 된 STARTUPINFO 구조체의 lpDesktop 멤버를 사용하여 다른 데스크톱에서 프로세스를 시작할 수 있습니다. 이 방법으로 프로세스는 모든 창을 표시하지만 다른 바탕 화면에서는 사용자 (또는 사용자)가 귀찮게하지 않을 것입니다.

필자는 여러 대의 데스크탑으로 작업 한 적이 없으므로 부작용이 무엇인지 말할 수는 없지만 그것이 가능하다고 생각합니다. 먼저 CreateDesktop을 살펴보고 다음으로 이동하십시오.

+0

좋아,이 작동하는 것, 그러나 나는 오류가 발생하고 MSDN 검색 후 DESKTOP_CREATEWINDOW 권한이 필요 없다고 말합니다. 내 프로세스의 권한을 변경하고 DESKTOP_CREATEWINDOW를 추가하는 방법을 알고 계십니까? – wonderer

+0

좋아, 알아 낸다. createdesktop이 답이었습니다. 감사! – wonderer

0

일부 프로그램은/무시 SW_HIDE 플래그를 오버라이드 (override) 할 수있다. 자식 프로세스가 시작된 후에 창을 숨길 수 있습니다.

다른 옵션은 CreateProcessAsUser을 사용하여 분리 된 데스크톱 (Vista 버전에서 시작)이있는 세션 0에서 프로세스를 실행하는 것입니다.

+0

하지만 내 앞에서 창을 깜박 거립니다. 매우 성가신 ... – wonderer

0

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

0

나는 서비스를 제안 할 것입니다. 한 가지는 아무도 로그인하지 않은 경우에도 예약 된 메인 테넌트를 실행할 수 있습니다. 다른 경우에는 서비스를 설정하여 데스크톱에 액세스 할 수 없도록 설정하는 것이 쉽습니다.