2009-09-16 2 views
2

Я сейчас делаю это следующим образом:Лучший способ «состыковать» стороннее приложение с запуском внутри панели windows.forms?


// _Container is the panel that the program is to be displayed in. 

System.Diagnostics.Process procTest = new System.Diagnostics.Process(); 
procTest.StartInfo.FileName = "TEST.EXE"; 
procTest.StartInfo.CreateNoWindow = false; 
procTest.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
procTest.Start(); 

procTest.WaitForInputIdle(); 
SetParent(procTest.MainWindowHandle, _Container.Handle); 
MoveWindow(procTest.MainWindowHandle, 
      0, 0, _Container.Width, _Container.Height, true); 

Проблема, которую я имею с этим кодом является то, что некоторые части интерфейса приложения перестают функционировать должным образом, когда я изменить MainWindowHandle (т.е. : кнопки отсутствуют текст).

Есть ли способ сделать это, не вызывая проблем с пристыкованным приложением? (Либо через .net, либо user32)?

+0

+1 ... Я попытался включить другие приложения, используя AHK, но всегда хотел знать, как это сделать на C#. В конечном счете, я бы использовал его, чтобы отобразить панель задач, лоток, кнопку запуска и т. Д. И создать индивидуальный пользовательский интерфейс. – Sivvy

ответ

1

Прежде всего, вместо того, чтобы просто ждать 1,5 секунды, попробуйте позвонить procTest. WaitForInputIdle, чтобы подождать, пока его цикл сообщений станет бесплатным. Вы уже зарегистрированы.

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

EDIT: Вы можете попытаться сохранить другую программу над своей областью хостинга, скрывшись от панели задач, удалив ее заголовок, перемещая ее по мере продвижения вашей программы и т. Д. Однако это все равно не будет работать отлично ; Я рекомендую вам попробовать найти альтернативу.

Попробуйте обратиться к оригинальным разработчикам стороннего приложения и просить их совета.

+0

Спасибо, я заметил это и был изменен до WaitForInput примерно в то же время, когда вы отправили свой ответ, иначе я бы оставил его там, чтобы другие могли видеть, о чем вы говорили. Сожалею! Прямо сейчас, большая часть программы, которую я размещаю, включая пользовательский интерфейс, отлично работает, когда я меняю MainWindowHandle, но некоторые части этого не делают. Есть ли способ разместить без изменения MainWindowHandle? – cabgef

+0

Похоже, вы правы. Третье приложение захватывает его MainWindowHandle, когда оно запускает и использует этот хранимый дескриптор в довольно многих местах, поэтому весь его код с использованием этих хранимых значений неисправностей. К счастью, я смог работать с оригинальными разработчиками. Решение, которое мы использовали, заключалось в том, чтобы добавить возможность изменения хранимого MainWindowHandle в API размещенного приложения (несколько строк кода на C++ в источнике), остальная часть кода теперь работает нормально. – cabgef

 Смежные вопросы

  • Нет связанных вопросов^_^