문제

다음 코드를 사용하여 기본 창이 숨겨진 응용 프로그램을 만들고 있습니다.

STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;

memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));

siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK | STARTF_USESTDHANDLES;
siStartupInfo.wShowWindow = SW_HIDE;

if(CreateProcess(MyApplication, "", 0, 0, FALSE, 0, 0, 0, &siStartupInfo, &piProcessInfo) == FALSE)  
{
 // blah    
 return 0;
}

내 기본 응용 프로그램 (이 코드 호출)을 제외한 모든 것이 올바르게 작동합니다. 창은 새 프로그램을 열 때 초점을 잃습니다. 새로운 프로세스의 우선 순위를 낮추려고 시도했지만 초점 문제는 여전히 있습니다.

어쨌든 이것을 피할 수 있습니까? 또한 CreateProcess (또는 shellexecute와 같은 CreateProcess를 호출하는 API)를 사용하지 않고 다른 프로세스를 만들 수있는 방법이 있습니까?

내 생각에 내 앱은 숨겨져있을 때에도 새로운 프로세스에 주어 졌기 때문에 집중력을 잃고 있다는 것입니다.

평범한 "왜 이것을하고 싶은가?"를 물어볼 수있는 호기심 많은 사람들에게, 내 대답은 서비스가 될 수없는 Watchdog 프로세스가 있고 기본 응용 프로그램을 열 때마다 시작하기 때문입니다. 만족하는?

도와 주셔서 감사합니다. 코드는 감사하겠습니다. 발목 끈.

도움이 되었습니까?

해결책

실행중인 응용 프로그램은 창에 초점을 맞추고 있습니다.

이 문제를 해결하는 한 가지 방법은 새로운 데스크탑에서 새 프로세스를 시작하는 것입니다. 이렇게하면 애플리케이션이 데스크탑에 창에 초점을 맞추지 못하게됩니다.

새 데스크톱에서 프로세스를 실행하는 코드는 다음과 같은 모습을보아야합니다.

HDESK hOld = GetThreadDesktop( GetCurrentThreadId() );
HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL );
SetThreadDesktop( hNew );
CreateProcess( ... );
SetThreadDesktop( hOld );
CloseDesktop( hNew );

다른 팁

분명히 대상 응용 프로그램은 Showwindow 플래그를 존중하지 않습니다. 욕심이 없도록 발사 된 응용 프로그램을 수정해야합니다.

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