2017-09-15 67 views
3

如何创建/产卵Win32过程没有鼠标和键盘的重点和交互?创建过程没有键盘和鼠标,交互和焦点

可以提到一些最合适的Win API函数创建窗口过程而不显示为最顶层的窗口,但留在其他打开的窗口中?

(假设你有产卵/创建进程的(非全屏)的Direct3D可执行程序和程序由父程序therfore无需用户交互的终止,但因此自动化它被创建时,它应该显示在其他已经打开的窗口之后)。

+0

什么编程语言? – Asesh

回答

3

启动一个进程与不活动SW_ *值是不够的,但如果你是前台窗口您也可以拨打LockSetForegroundWindow禁用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 
} 

如果您的应用程序不需要SetForegroundWindow那么你不” t不得不解锁,但无论如何这可能是一个好主意:

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谢谢你的回答。伟大的帮助。投票.. – Buddhika