2011-07-27 97 views
3

我使用CreateProcess API從我的應用程序啓動了一個進程,並且希望將新進程的窗口置頂。有沒有辦法做到這一點?我們有CreateProcess的標誌或類似的東西嗎?如何在通過CreateProcess創建的進程上創建窗口

+0

HTTP:/ /stackoverflow.com/questions/916259/win32-bring-a-window-to-top – Schnommus

+0

你的意思是隻顯示窗口,或實際上在頂部? – Ajay

+0

在這個重複中有一個有用的答案:http://stackoverflow.com/questions/25034867/how-to-make-createprocess-open-new-process-in-focus-and-not-in-background一個簡單的' TranslateMessage'調用使其按預期工作。 – Kaz

回答

8

你可以嘗試使用它與CreateProcess的,並設置SW_SHOW通過在STARTUPINFO結構。我不確定這將有助於將重點放在頂端。如果這不起作用,請嘗試以下操作。

首先,不要使用FindWindow(),它不必要地不可靠,因爲它只能通過窗口名稱和類名稱工作。相反,從您的CreateProcess()調用中,您應該讀取lpProcessInformation並獲取dwProcessId。然後調用EnumWindows(),有你的回調是這個樣子:

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { 
    DWORD dwPID; 

    GetWindowThreadProcessId(hwnd, &dwPID); 

    if(dwPID == lParam) { 
    SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); 

    // Or just SetFocus(hwnd); 
    return FALSE; 
    } 

    return TRUE; 
} 

當調用EnumWindows的(),您將需要在您之前在lParam的像這樣抓起PID傳遞:

+0

是的,我用這個,並按我想要的方式工作。謝謝 – Rahul

0

您需要啓動應用程序的窗口句柄。如果你沒有它,你可以使用FindWindowA API調用。

然後使用帶窗口句柄的SetFocus API調用作爲參數。

相關鏈接:

http://www.andreavb.com/tip020001.html
http://msdn.microsoft.com/en-us/library/aa697422%28v=vs.71%29.aspx

+2

但絕對不要使用'FindWindowA'。 ANSI變體在Windows 98中過時了。不知道你從哪裏得到這個建議。任何在過去15年中編寫的應用程序都應該使用這些函數的Unicode版本。 'FindWindowW'是你正在尋找的功能,或者更好的是'FindWindow'。你有沒有注意到你在MSDN上挖過的古怪東西?它的標題是「將16位代碼移植到32位Windows」。 –

+0

Jeroen的+1。我想避免調用FindWindow。我使用了邁克的建議。 – Rahul

相關問題