2016-06-30 2 views
-2

Недавно я пытался работать на старом проекте у меня был я не в состоянии получить SetParent работать он продолжает давать мне ошибку «InvalidOperationException», вот код:SetParent не работает InvalidOperationException

private void button1_Click(object sender, EventArgs e) 
    { 
     Process proc = Process.Start("calc.exe"); 
     proc.WaitForInputIdle(); 
     Thread.Sleep(500); 
     SetParent(proc.MainWindowHandle, this.Handle); 
    } 

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

+0

Где ваш метод SetParent? Я не думаю, что он может установить родительский процесс в другой процесс. Взгляните сюда, попробуйте сначала, вероятно, работает: http://stackoverflow.com/questions/10773003/attach-form-window-to-another-window-in-c-sharp –

+0

'SetParent' - родной Windows API и не может выбросить никаких исключений .NET никогда. Свойство 'Process.MainWindowHandle' может. Свойство 'Control.Handle' тоже может. В любом случае трассировка стека исключений сообщит вам, в каком конкретном случае будет выбрано исключение, и сообщение будет содержать более подробную информацию, чем просто «InvalidOperationException». В вашем вопросе недостаточно информации, чтобы кто-либо мог ответить на ваш вопрос, но ваш отладчик должен быть в состоянии рассказать вам все, что вам нужно знать. – hvd

+0

В нем говорится, что процесс завершен, поэтому запрошенная информация недоступна, может быть, это проблема с окнами 10? – Austin

ответ

0

Этот код ниже работает отлично на моей стороне (Пожалуйста, проверьте декларацию вашей функции API Windows, SetParent):

[DllImport("user32.dll", SetLastError = true)] 
    private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Process proc = Process.Start("calc.exe"); 
     proc.WaitForInputIdle(); 
     Thread.Sleep(500); 
     SetParent(proc.MainWindowHandle, this.Handle); 
    } 

Результат:

enter image description here

Надежда, что помогает:)

+0

Я вижу, что вы на окнах 7, может быть, это проблема с окнами 10? – Austin

+0

Ну, в Windows 10 приложение калькулятора - это приложение ** Windows Store ** (а не настольное приложение). Итак, 'MainWindowHandle' не будет работать для этого. Попробуйте 'notepad.exe' вместо' calc.exe', и он должен работать .. проверьте [этот снимок экрана] (https://s32.postimg.org/z9qcwonat/Capture.png). –

+0

Возможно, вы можете получить дескриптор окна приложения Windows Store с помощью Windows API в соответствии с [этим сообщением] (https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/7e25e104-36cb-41ac -8f36-0e4c6b6146a3/find-hwnd-of-metro-app-using-win32-api? Forum = windowsgeneraldevelopmentissues), но, к сожалению, он находится на C++. Хотя я не уверен, даже если вам удалось получить hwnd, что вы сможете встраивать приложение хранилища Windows в приложение, используя тот же подход (возможно, я ошибаюсь). Удачи :) –

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