c++ कैसे ShellExecuteEx द्वारा खोला खिड़की का hWnd प्राप्त करने के लिए.. hProcess?



window handle (1)

पहले अपने कार्यक्रम को रोकने के लिए WaitForInputIdle का प्रयोग करें जब तक कि एप्लिकेशन शुरू न हो जाए और उपयोगकर्ता इनपुट (तब तक मुख्य विंडो बनायी जानी चाहिए) के लिए इंतजार कर रहा है, तब सिस्टम में कौन सी विंडो निर्मित प्रक्रिया से संबंधित हैं यह निर्धारित करने के लिए EnumWindows और GetWindowThreadProcessId का उपयोग करें

उदाहरण के लिए:

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.....
}

यह "सरल" मुद्दा पक्ष मुद्दों से भरा लगता है
जैसे। क्या नई प्रक्रिया कई विंडो खोलती है; क्या यह एक छप स्क्रीन है?
क्या कोई आसान तरीका है? (मैं नोटपैड का नया इंस्टेंस शुरू कर रहा हूं ++)

...
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?
}
...




handle