2010-07-16 22 views
7

Bu "basit" sorun, yan sorunları ile dolu gibi görünüyor. Örneğin,
. Yeni işlem birden çok pencereyi açar mı; Bir açılış ekranı var mı?
Basit bir yolu var mı? Uygulama başladıktan kadar programınızı duraklatmak içinKabukExecuteEx tarafından açılan pencerenin hWnd nasıl .. hProcess?

... 
std::tstring tstrNotepad_exe = tstrProgramFiles + _T("\\Notepad++\\notepad++.exe"); 

SHELLEXECUTEINFO SEI={0}; 
sei.cbSize  = sizeof(SHELLEXECUTEINFO); 
sei.fMask  = SEE_MASK_NOCLOSEPROCESS; 
sei.hwnd   = hWndMe; // This app's window handle 
sei.lpVerb  = _T("open"); 
sei.lpFile  = tstrNotepad_exe.c_str();  
sei.lpParameters = _T(" -multiInst -noPlugins -nosession -notabbar "; 
sei.lpDirectory = NULL; 
sei.nShow  = SW_SHOW; 
sei.hInstApp  = NULL;  
if(ShellExecuteEx(&sei)) 
{ // I have sei.hProcess, but how best to utilize it from here? 
} 
... 

cevap

12

İlk kullanımını WaitForInputIdle (I ++ Notepad yeni bir örneğini başlıyorum) ve (ana pencere o zamana kadar oluşturulmuş olması gerekir) kullanıcı girişi bekliyor, daha sonra kullanmak Sistemdeki hangi pencerelerin oluşturulmuş sürece ait olduğunu belirlemek için EnumWindows ve GetWindowThreadProcessId. Örneğin

:

struct ProcessWindowsInfo 
{ 
    DWORD ProcessID; 
    std::vector<HWND> Windows; 

    ProcessWindowsInfo(DWORD const AProcessID) 
     : ProcessID(AProcessID) 
    { 
    } 
}; 

BOOL __stdcall EnumProcessWindowsProc(HWND hwnd, LPARAM lParam) 
{ 
    ProcessWindowsInfo *Info = reinterpret_cast<ProcessWindowsInfo*>(lParam); 
    DWORD WindowProcessID; 

    GetWindowThreadProcessId(hwnd, &WindowProcessID); 

    if(WindowProcessID == Info->ProcessID) 
     Info->Windows.push_back(hwnd); 

    return true; 
} 

.... 

if(ShellExecuteEx(&sei)) 
{ 
    WaitForInputIdle(sei.hProcess, INFINITE); 

    ProcessWindowsInfo Info(GetProcessId(sei.hProcess)); 

    EnumWindows((WNDENUMPROC)EnumProcessWindowsProc, 
     reinterpret_cast<LPARAM>(&Info)); 

    // Use Info.Windows..... 
} 
+0

Teşekkür Jon ... Yani kısa aralıklı yoklama ... ben ... şimdi örnek üzerinden ve çalışıyorum anlamda :) –

+0

yapar gitmek yoludur Önceki yorumuma PS: Sadece MSDN'de fark ettim: WaitForInputIdle sadece uygulama başlangıcında değil, herhangi bir zamanda kullanılabilir. Ancak, WaitForInputIdle bir işlemin boşta kalması için yalnızca bir kez bekler; Süreç boşta mı yoksa meşgulse, sonraki WaitForInputIdle çağrıları hemen geri döner. * Yoklama iyi bir fikir değil gibi görünüyor ... Birkaç test yapacağım. –

+0

Süreç oluşturulduğunda yalnızca WaitForInputIdle kullanmanız gerekir. Bundan sonra, EnumWindows'un güncellenen pencere listesini almasını çağır. –

İlgili konular