2010-03-08 3 views
2

Я пытаюсь получить свою форму C#, чтобы правильно ее правильно определить в стороннем приложении. У меня есть дескриптор элемента управления, для которого я хочу, чтобы моя форма была родительской, но просто не могу похоже, заставляют его работать.Создать окно в качестве дочернего элемента в стороннем приложении

alt text http://img693.imageshack.us/img693/8871/examplec.jpg

Я хотел бы создать свою форму, так что она является частью MDICLIENT, ручки 005E0ED6. Также как Window 01D7157D.

Возможно ли это? Если так, то это можно сделать в C#?

ответ

2

Как вы это пробовали? Вы попробовали SetParent? См. Следующий вопрос StackOverflow, чтобы узнать, помогает ли он. Embedding HWND into external process using SetParent

+0

Да, я попытался установить родительский элемент, но моя форма создана вне MDIClient и, похоже, не хочет быть частью этого. –

+0

Можете ли вы показать код? – Josh

+0

Ahh Я не видел этого вопроса, я заглядываю в него. –

1

Этот код, кажется, работает:

[DllImport("user32.dll")] 
    private static extern 
     IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); 

    [DllImport("user32.dll")] 
    private static extern 
     IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach); 

     WinAPI.SetParent(this.Handle, otherappshandle); 

     IntPtr otherprocessID = GetWindowThreadProcessId(otherappshandle, new IntPtr(0)); 
     IntPtr threadID = new IntPtr(AppDomain.GetCurrentThreadId()); 

     AttachThreadInput(threadID , otherprocessID , 1); 
+0

Эта переменная должна быть названа 'otherThreadID', а не' otherprocessID', потому что возвращаемое значение GetWindowThreadProcessId() 'является идентификатором потока – torvin

0

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

SetParent() и тому подобное поможет вам части пути там, но есть куча маленьких подводных камней, чтобы посмотреть, насколько системы в целом (сообщение антиблокировки насоса и т.д.), которые просто делают это время раковины ,

С WinForms, особенно, я настоятельно рекомендую просто запустить ваш пользовательский интерфейс в основном процессе (если можно), и если вы хотите изолировать свою обработку в другом процессе, сделайте это вместо этого.