2017-09-15 12 views
3

마우스와 키보드의 초점 및 상호 작용없이 Win32 프로세스를 생성/생성하는 방법은 무엇입니까?키보드 및 마우스, 상호 작용 및 포커스를 사용하지 않고 프로세스를 생성하십시오.

Win API은 윈도우 프로세스를 최상위 창으로 표시하지 않고 창을 열지 만 다른 열린 창에는 그대로 두는 기능이 있습니까?

(당신이이 생성됩니다 때 표시해야/산란을 전체 화면되지() 프로그램을 실행하고 프로그램이 부모 프로그램의 사용자 상호 작용 therfore 필요가 없습니다에 의해 종료 Direct3D를 윈도우 모드 의 프로세스를 생성해야하지만, 따라서 자동화 된 가정 이미 열려있는 다른 창 뒤). '응용 프로그램 SetForegroundWindow를 필요로하지 않는 경우

void backgroundcalc_simple() 
{ 
    LockSetForegroundWindow(LSFW_LOCK); 
    ShellExecute(NULL, NULL, TEXT("Calc"), NULL, NULL, SW_SHOWNA); 
    // Cannot unlock here without a hacky call to Sleep 
} 

다음 돈 :

+0

어떤 프로그래밍 언어를 사용할 수 있습니까? – Asesh

답변

3

비활성 SW_ * 값으로 프로세스를 시작하는 것은 충분하지 않습니다하지만 당신은 전경 창 경우 당신은 또한 SetForegroundWindow를 사용하지 않도록 LockSetForegroundWindow를 호출 할 수 있습니다 잠금을 해제해야하지만 어쨌든 그렇게하는 것이 좋습니다.

BOOL CALLBACK ProcessHasVisibleWindowProc(HWND hWnd, LPARAM Param) 
{ 
    if (IsWindowVisible(hWnd) && (WS_CAPTION & GetWindowLongPtr(hWnd, GWL_STYLE))) 
    { 
     DWORD thispid, *wantedpid = (DWORD*) Param; 
     if (GetWindowThreadProcessId(hWnd, &thispid) && thispid == *wantedpid) 
     { 
      *wantedpid = 0; 
      return FALSE; 
     } 
    } 
    return TRUE; 
} 
BOOL ProcessHasVisibleWindow(DWORD Pid) 
{ 
    if (!Pid) return FALSE; 
    EnumWindows(ProcessHasVisibleWindowProc, (LPARAM) &Pid); 
    return Pid == 0; 
} 

BOOL WaitForVisibleProcessWindow(DWORD Pid, DWORD Timeout) 
{ 
    DWORD start = GetTickCount(); 
    for (;;) 
    { 
     if (ProcessHasVisibleWindow(Pid)) return TRUE; 
     if (GetTickCount() - start >= Timeout && Timeout != INFINITE) break; 
     Sleep(50); 
    } 
    return FALSE; 
} 

void backgroundcalc() 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    si.dwFlags = STARTF_FORCEOFFFEEDBACK|STARTF_USESHOWWINDOW; 
    si.wShowWindow = SW_SHOWNA; 
    WCHAR cmd[MAX_PATH]; 
    lstrcpy(cmd, TEXT("Calc")); 
    LockSetForegroundWindow(LSFW_LOCK); 
    if (CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) 
    { 
     WaitForInputIdle(pi.hProcess, 3333); 
     WaitForVisibleProcessWindow(pi.dwProcessId, 1000*10); 
     CloseHandle(pi.hProcess); 
     CloseHandle(pi.hThread); 
    } 
    LockSetForegroundWindow(LSFW_UNLOCK); 
} 
+0

@Andres 답변 해 주셔서 감사합니다. 위대한 help.up 투표 .. – Buddhika