Уважаемые мастера, существует ли метод, при загрузке чужого приложения, например блокнота (моё приложение само запускает его), вставить результирующее окно (редактор текста), например на панельку, которая находится в моём приложении?
Заранее благодарен.
Здравствуйте, Thespian, Вы писали:
T>Уважаемые мастера, существует ли метод, при загрузке чужого приложения, например блокнота (моё приложение само запускает его), вставить результирующее окно (редактор текста), например на панельку, которая находится в моём приложении?
Только нужно, естественно, дождаться создания окон запускаемого приложения. Да и покалеченное гланое окошко "жертвы", наверное, лучше потом спрятать из эстетических соображений =)
Re[2]: Вставить чужое главное окно в своё приложение
Здравствуйте, Sl4v4, Вы писали:
S>Здравствуйте, Thespian, Вы писали:
T>>Уважаемые мастера, существует ли метод, при загрузке чужого приложения, например блокнота (моё приложение само запускает его), вставить результирующее окно (редактор текста), например на панельку, которая находится в моём приложении?
S>Запросто: S>
S>Только нужно, естественно, дождаться создания окон запускаемого приложения. Да и покалеченное гланое окошко "жертвы", наверное, лучше потом спрятать из эстетических соображений =)
А можно как-то отловить его появление? чтобы не мерцало для пользователя?
Re[3]: Вставить чужое главное окно в своё приложение
Здравствуйте, Thespian, Вы писали:
T>А можно как-то отловить его появление? чтобы не мерцало для пользователя?
Отловить можно перехватом API-функций, но это слишком уж мудрёно получиться для такой задачки. Можно запускать его с помощью ShellExecute с параметром SW_HIDE, а дальше в цикле вызывать FindWindow(Ex) и ждать пока окно не будет создано...
Re[3]: Вставить чужое главное окно в своё приложение
Хотелось бы ещё добавить, что если другая копия запускаемого приложения уже выполняется, то скорее всего программа найдёт её окно, а не той копии что нужно. Может удобнее запускать программу через CreateProcess, чтобы получть ID процесса, а потом перебирать окна, в поисках окон именно этого процесса. Наверное этот способ будет более гибким, т.к. в структуре STARTUPINFO можно указать не только способ отображения окна, но и много других параметров, которые могут оказаться полезными...
Re[4]: Вставить чужое главное окно в своё приложение
Здравствуйте, Sl4v4, Вы писали:
S> Хотелось бы ещё добавить, что если другая копия запускаемого приложения уже выполняется, то скорее всего программа найдёт её окно, а не той копии что нужно. Может удобнее запускать программу через CreateProcess, чтобы получть ID процесса, а потом перебирать окна, в поисках окон именно этого процесса. Наверное этот способ будет более гибким, т.к. в структуре STARTUPINFO можно указать не только способ отображения окна, но и много других параметров, которые могут оказаться полезными...
а WaitForInputIdle вместо перебора окон не лучше?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Вставить чужое главное окно в своё приложение
Здравствуйте, Bork, Вы писали:
B>а WaitForInputIdle вместо перебора окон не лучше?
Перебор нужен для получения хэндла окна именно запущенной нами копии (если есть вероятность того, что другая копия уже запущена). Уверен что есть варианты и получше, но как сюда WaitForInputIdle пристроить — не понимаю. Тем более что есть условие: "чтобы не мерцало для пользователя".
Re[6]: Вставить чужое главное окно в своё приложение
Здравствуйте, Sl4v4, Вы писали:
S>Здравствуйте, Bork, Вы писали:
B>>а WaitForInputIdle вместо перебора окон не лучше?
S>Перебор нужен для получения хэндла окна именно запущенной нами копии (если есть вероятность того, что другая копия уже запущена). Уверен что есть варианты и получше, но как сюда WaitForInputIdle пристроить — не понимаю. Тем более что есть условие: "чтобы не мерцало для пользователя".
WaitForInputIdle использовать для того что бы не крутить цикл типа while(FindWindow != NULL)
схема примерно такая...
запускаем дочерний процесс
CreateProcess // получаем хендл hProcess
WaitForInputIdle(hProcess, INFINITE) // ждем пока процесс полностью стартует
дочерний процесс запущен и готов к использованию
идем в msdn http://msdn.microsoft.com/msdnmag/issues/02/07/CQA/
читаем как получить хендл нужного нам окна
делаем с этим окном что хотим
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Вставить чужое главное окно в своё приложение
T>>Уважаемые мастера, существует ли метод, при загрузке чужого приложения, например блокнота (моё приложение само запускает его), вставить результирующее окно (редактор текста), например на панельку, которая находится в моём приложении?
S>Запросто: S>
Здравствуйте, Bork, Вы писали:
B>WaitForInputIdle использовать для того что бы не крутить цикл
Да, теперь согласен. Мне просто почему-то казалось, что WaitForInputIdle не завершится если окно будут скрытым
Re[3]: Вставить чужое главное окно в своё приложение
AS>> The new parent window and the child window must belong to the same application
AS>>Так что не получится. S>Не надо верить всему что пишут в газетах. Лучше попробовать, и самому увидеть результат
Попробуйте. На всех доступных операционных системах. Я предпочитаю в таких случаях верить MSDN, нежели получаемым локальным результатам. Впрочем, дело ваше.
Здравствуйте, Andrew S, Вы писали:
AS> The new parent window and the child window must belong to the same application AS> Так что не получится.
Слегка раздвинем цитату:
"An application can use the SetParent function to set the parent window of a pop-up, overlapped, or child window.
The new parent window and the child window must belong to the same application."
Что можно понять и так, что к same application must belong именно child window, а к pop-up и overlapped сие не относится.
И потому вот это — может, и не локальный результат
Здравствуйте, Andrew S, Вы писали:
T>>>Уважаемые мастера, существует ли метод, при загрузке чужого приложения, например блокнота (моё приложение само запускает его), вставить результирующее окно (редактор текста), например на панельку, которая находится в моём приложении?
S>>Запросто: S>>
AS>> The new parent window and the child window must belong to the same application AS>> Так что не получится.
K>Слегка раздвинем цитату:
K>"An application can use the SetParent function to set the parent window of a pop-up, overlapped, or child window. K>The new parent window and the child window must belong to the same application."
Может и так. Но в любом случае под редактором текста я подразумевал только EDIT, а не весь блокнот (для меня это просто оказалось дикостью).
K>Что можно понять и так, что к same application must belong именно child window, а к pop-up и overlapped сие не относится. K>И потому вот это — может, и не локальный результат
Может и так (хотя, на мой взгляд, цитата относится именно к параметрам SetParent, нежели к типу окон). Впрочем, в любом случае я не подразумевал оверлапед или попап окна под окном редактора текста, посему и привел указанную цитату.
Здравствуйте, Thespian, Вы писали:
T> Почему же, получилось, но только всё окно присутствует у меня на панельке. Его там можно перетягивать, масштабировать и т.д. Что не очень желательно.
А зачем всё окно-то воровать? Я думал нужно только какое-то дочернее... В любом случае, можно же изменить его стиль на нужный, чтобы нельзя было, скажем, размер менять...
Re[5]: Вставить чужое главное окно в своё приложение
Очень ценю Paul DiLascia, но как раз CMainWindowIterator может и не сработать:
ведь он построен на EnumWindows и перебирает только top-level окна,
тогда как "нужное нам окно" может и не быть top-level !
Здравствуйте, Sl4v4, Вы писали:
S>Здравствуйте, Thespian, Вы писали:
T>> Почему же, получилось, но только всё окно присутствует у меня на панельке. Его там можно перетягивать, масштабировать и т.д. Что не очень желательно. S>А зачем всё окно-то воровать? Я думал нужно только какое-то дочернее... В любом случае, можно же изменить его стиль на нужный, чтобы нельзя было, скажем, размер менять...
Не подскажете, как это сделать? Бо я что-то не могу врубиться в эти стили...
Re[6]: Вставить чужое главное окно в своё приложение