如何創建/產卵Win32過程沒有鼠標和鍵盤的重點和交互?創建過程沒有鍵盤和鼠標,交互和焦點
可以提到一些最合適的Win API函數創建窗口過程而不顯示爲最頂層的窗口,但留在其他打開的窗口中?
(假設你有產卵/創建進程的窗(非全屏)的Direct3D可執行程序和程序由父程序therfore無需用戶交互的終止,但因此自動化它被創建時,它應該顯示在其他已經打開的窗口之後)。
如何創建/產卵Win32過程沒有鼠標和鍵盤的重點和交互?創建過程沒有鍵盤和鼠標,交互和焦點
可以提到一些最合適的Win API函數創建窗口過程而不顯示爲最頂層的窗口,但留在其他打開的窗口中?
(假設你有產卵/創建進程的窗(非全屏)的Direct3D可執行程序和程序由父程序therfore無需用戶交互的終止,但因此自動化它被創建時,它應該顯示在其他已經打開的窗口之後)。
啓動一個進程與不活動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);
}
@Andres謝謝你的回答。偉大的幫助。投票.. – Buddhika
什麼編程語言? – Asesh