C# SetParent不工作InvalidOperationException

C# SetParent不工作InvalidOperationException,c#,setparent,C#,Setparent,我最近尝试处理一个旧项目,我遇到了一个问题,我无法让setparent正常工作,它一直给我“InvalidOperationException”错误,下面是代码: private void button1_Click(object sender, EventArgs e) { Process proc = Process.Start("calc.exe"); proc.WaitForInputIdle(); Thread.Sleep(500

我最近尝试处理一个旧项目,我遇到了一个问题,我无法让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);
    }

它被一个按钮调用,当它试图设置父对象时,会出错。我在网上找到的所有东西都表明我的代码是正确的。

下面的代码在我这边运行良好(请检查Windows API函数的声明
SetParent
):

结果:


希望有帮助:)

下面的代码在我这方面运行良好(请检查Windows API函数的声明
SetParent
):

结果:


希望有帮助:)

您的SetParent方法在哪里?我认为不可能将父进程设置为另一进程。看看这里,先试试,可能会有用:
SetParent
是本机Windows API,永远不可能抛出任何.NET异常。
Process.MainWindowHandle
属性可以。
控件.句柄
属性也可以。在任何一种情况下,异常堆栈跟踪都会告诉您异常抛出的具体位置,并且该消息将提供比“InvalidOperationException”更多的详细信息。您的问题中没有足够的信息,任何人都无法回答您的问题,但您的调试器应该能够告诉您需要知道的一切。它表示进程已退出,因此请求的信息不可用,这可能是windows 10的问题吗?在我的计算机上,这对32位应用程序很有效,但在每个64位应用程序上都会引发异常。你的SetParent方法在哪里?我认为不可能将父进程设置为另一进程。看看这里,先试试,可能会有用:
SetParent
是本机Windows API,永远不可能抛出任何.NET异常。
Process.MainWindowHandle
属性可以。
控件.句柄
属性也可以。在任何一种情况下,异常堆栈跟踪都会告诉您异常抛出的具体位置,并且该消息将提供比“InvalidOperationException”更多的详细信息。您的问题中没有足够的信息,任何人都无法回答您的问题,但您的调试器应该能够告诉您需要知道的一切。它表示进程已退出,因此请求的信息不可用,这可能是windows 10的问题吗?在我的计算机上,这对32位应用程序很有效,但在每个64位应用程序上都会引发异常。我发现您使用的是windows 7。这可能是windows 10的问题吗?在windows 10中,计算器应用程序是windows应用商店应用程序(不是桌面应用程序)。因此,
MainWindowHandle
对它不起作用。尝试
notepad.exe
而不是
calc.exe
,它应该可以工作。。根据Windows API,你可以得到Windows商店应用程序的窗口句柄,但不幸的是它是C++的。尽管我不确定——即使你成功获得了hwnd——你是否能够使用相同的方法将Windows应用商店应用嵌入到你的应用程序中(我可能错了)。祝你好运:)我看到你在windows 7上,这可能是windows 10的问题吗?嗯,在windows 10中,计算器应用程序是windows应用商店应用程序(不是桌面应用程序)。因此,
MainWindowHandle
对它不起作用。尝试
notepad.exe
而不是
calc.exe
,它应该可以工作。。根据Windows API,你可以得到Windows商店应用程序的窗口句柄,但不幸的是它是C++的。尽管我不确定——即使你成功获得了hwnd——你是否能够使用相同的方法将Windows应用商店应用嵌入到你的应用程序中(我可能错了)。祝你好运:)
    [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);
    }