Консультация № 63972
24.11.2006, 09:26
0.00 руб.
0 6 3
Уважаемые Эксперты!
Благодарю Вас за ранее оказанную мне помощь - я сумел использовать её весьма конструктивно.
Но у меня снова возник вопрос, который я никак в MSDN не могу нарыть.
У меня VS 2005, MFC.

У меня есть несколько приложений, которые несколько приложений, которые при наступлении определённых условий должны вытаскиваться наверх на экране и становиться активными. Для каждой прилады свой пул условий. Я предположил следующую схему:

Эти приложения прописываются в данных моего самопального приложения и запускаются все при его запуске (я использовал для этого ShellExecute). Вроде логично и удобно. Всё нормально запускается, условия тоже успешно вычисляются.
Но вот на активизации я споткнулся! Похоже, надо получить для вновь открытого приложения что-то типа CWnd или HWND. Но как к этому подступиться - никак не могу понять. Пробовал для CWnd GetActiveWindow, но получаю во всех вариантах CWnd моего самопала. К HWND вообще не нашёл для MFC подходов.

Помогите, пожалуйста! Вероятно, я зациклился в каком-то тупике.

Обсуждение

Неизвестный
24.11.2006, 09:37
общий
это ответ
Здравствуйте, Васильев Н.Ю.!
Конкретно в вашем случае поможет поиск дескриптора окна (HWND) по наименованию:
Смотрите EnumWindows и EnumWindowsProc
А вообще то было бы лучше запускать приложения не ShellExecute, а с помощью CreateProcess, тогда вы сразу сможете получить дескриптор окна и сохранить его например в массиве в своей программе
Неизвестный
24.11.2006, 09:42
общий
это ответ
Здравствуйте, Васильев Н.Ю.!
Нет, тут все проще намного. Для поиска нужного окна используем FindWindow:
HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName);

Например,
HWND hWnd = FindWindow(NULL, "My Super Window");
Тут мы первый параметр опускаем, т.к. можем и не знать какое название класса окна использовалось при вызове RegisterClass или RegisterClassEx. Во втором указываем название окна.

А далее вызываем SetForegroundWindow:
BOOL SetForegroundWindow(HWND hWnd);

И наслаждаемся жизнью. Остальные подробности в MSDN.

Успехов.
Неизвестный
24.11.2006, 09:56
общий
это ответ
Здравствуйте, Васильев Н.Ю.!

Добавлю, если Вы не знаете точно заголовок окна, или он может меняться, поиск придется вести по декскриптору процесса.
Можно, например, зпускать приолжение при помощи ShellExecuteEx, чтобы получить его, потом при наступлении нужного события перебирать окна и искать созданное нужным процессом. Пример в приложении.

Удачи!

Приложение:
// Запуск приложенияSHELLEXECUTEINFO sei;memset(&sei, 0, sizeof(SHELLEXECUTEINFO));sei.cbSize = sizeof(SHELLEXECUTEINFO);sei.fMask = SEE_MASK_NOCLOSEPROCESS;sei.lpVerb = "open";sei.lpFile = "your_file.exe";sei.nShow = SW_SHOW;ShellExecuteEx(&sei);HANDLRE hProcess = sei.hProcess;DWORD idProcess = GetProcessId(hProcess);...// При необходимости показать окноEnumWindows(wEnumProc, (LPARAM) hProcess);...BOOL CALLBACK wEnumProc(HWND hwnd, LPARAM lParam){ DWORD idTargetProcess = (DWORD) lParam; HANDLE hPrc = 0; GetWindowThreadProcessId(hWnd, &idPrc); if (idPrc == idTargetProcess) { // ... показываем окно hWnd return FALSE; } return TRUE;}
Неизвестный
24.11.2006, 10:45
общий
Уважаемый Jadd!Я сюда "совался", но меня смутило, где взять название окна? Я с окнами ещё практически не освоился.Не подскажете ли ещё чуть-чуть?
Неизвестный
24.11.2006, 10:51
общий
Уважаемый Сергей!Спасибо за пример исходника. Только один момент мне в нём не понятен: параметр HWND hwnd дляBOOL CALLBACK wEnumProc(HWND hwnd, LPARAM lParam){}- входной параметр, так? Как мне его задать?
Неизвестный
29.11.2006, 22:06
общий
Tek, Jadd, Сергей - большое Вам спасибо за ответы.Смогу к данному вопросу приступить вновь только на следующей неделе, но, думаю, что Ваша помощь достаточна.
Форма ответа