Хотелось бы ещё добавить, что если другая копия запускаемого приложения уже выполняется, то скорее всего программа найдёт её окно, а не той копии что нужно. Может удобнее запускать программу через CreateProcess, чтобы получть ID процесса, а потом перебирать окна, в поисках окон именно этого процесса. Наверное этот способ будет более гибким, т.к. в структуре STARTUPINFO можно указать не только способ отображения окна, но и много других параметров, которые могут оказаться полезными...
Re[2]: Вставить чужое главное окно в своё приложение
T>>Уважаемые мастера, существует ли метод, при загрузке чужого приложения, например блокнота (моё приложение само запускает его), вставить результирующее окно (редактор текста), например на панельку, которая находится в моём приложении?
S>Запросто: S>
AS>> The new parent window and the child window must belong to the same application
AS>>Так что не получится. S>Не надо верить всему что пишут в газетах. Лучше попробовать, и самому увидеть результат
Попробуйте. На всех доступных операционных системах. Я предпочитаю в таких случаях верить MSDN, нежели получаемым локальным результатам. Впрочем, дело ваше.
Уважаемые мастера, существует ли метод, при загрузке чужого приложения, например блокнота (моё приложение само запускает его), вставить результирующее окно (редактор текста), например на панельку, которая находится в моём приложении?
Заранее благодарен.
Здравствуйте, Thespian, Вы писали:
T>Уважаемые мастера, существует ли метод, при загрузке чужого приложения, например блокнота (моё приложение само запускает его), вставить результирующее окно (редактор текста), например на панельку, которая находится в моём приложении?
Только нужно, естественно, дождаться создания окон запускаемого приложения. Да и покалеченное гланое окошко "жертвы", наверное, лучше потом спрятать из эстетических соображений =)
Re[2]: Вставить чужое главное окно в своё приложение
Здравствуйте, Sl4v4, Вы писали:
S>Здравствуйте, Thespian, Вы писали:
T>>Уважаемые мастера, существует ли метод, при загрузке чужого приложения, например блокнота (моё приложение само запускает его), вставить результирующее окно (редактор текста), например на панельку, которая находится в моём приложении?
S>Запросто: S>
S>Только нужно, естественно, дождаться создания окон запускаемого приложения. Да и покалеченное гланое окошко "жертвы", наверное, лучше потом спрятать из эстетических соображений =)
А можно как-то отловить его появление? чтобы не мерцало для пользователя?
Re[3]: Вставить чужое главное окно в своё приложение
Здравствуйте, Thespian, Вы писали:
T>А можно как-то отловить его появление? чтобы не мерцало для пользователя?
Отловить можно перехватом API-функций, но это слишком уж мудрёно получиться для такой задачки. Можно запускать его с помощью ShellExecute с параметром SW_HIDE, а дальше в цикле вызывать FindWindow(Ex) и ждать пока окно не будет создано...
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[7]: Вставить чужое главное окно в своё приложение
Здравствуйте, Bork, Вы писали:
B>WaitForInputIdle использовать для того что бы не крутить цикл
Да, теперь согласен. Мне просто почему-то казалось, что WaitForInputIdle не завершится если окно будут скрытым
Re[3]: Вставить чужое главное окно в своё приложение
Здравствуйте, 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]: Вставить чужое главное окно в своё приложение
Здравствуйте, Sl4v4, Вы писали: S>Только нужно, естественно, дождаться создания окон запускаемого приложения. Да и покалеченное гланое окошко "жертвы", наверное, лучше потом спрятать из эстетических соображений =)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Вставить чужое главное окно в своё приложение
AS>>> The new parent window and the child window must belong to the same application
AS>>>Так что не получится. S>>Не надо верить всему что пишут в газетах. Лучше попробовать, и самому увидеть результат
AS>Попробуйте. На всех доступных операционных системах. Я предпочитаю в таких случаях верить MSDN, нежели получаемым локальным результатам. Впрочем, дело ваше.