2017-09-15 5 views
3

どのように作成/生成するかWin32マウスとキーボードのフォーカスと操作を行わないでプロセスを起動しますか?キーボードとマウス、インタラクションとフォーカスを持たずにプロセスを作成

Win APIは、ウィンドウプロセスを作成する機能をもっていますが、ウィンドウの最上部に表示するのではなく、他の開いているウィンドウには表示されません。

(あなたはそれが作成されたときに表示されるはず/産卵フルスクリーンでない()プログラムの実行可能ファイルとそのプログラムが親プログラムのユーザインタラクションのtherfore不要で終了のDirect3Dを窓掛けのプロセスを作成する必要がなく、したがって、自動化されたと仮定すでに開いている他のウィンドウの後ろ)。非アクティブSW_ *値でプロセスを起動する

+0

どのようなプログラミング言語ですか? – Asesh

答えて

3

では十分ではありませんが、あなたが最前面ウィンドウであれば、あなたもSetForegroundWindowを無効にするLockSetForegroundWindowを呼び出すことができます。

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を必要としないならば、あなたは「ドンロックを解除する必要がありますが、とにかく行うことをお勧めします。

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

関連する問題