C#在windows窗体内运行外部exe

C#在windows窗体内运行外部exe,c#,winforms,exe,C#,Winforms,Exe,我试图在windows窗体中运行discord.exe,但我收到了此错误。谁能帮帮我,谢谢。以下是错误消息:英语错误消息(“系统找不到指定的文件”) 这是我的密码: [DllImport("user32.dll")] static extern IntPtr SetParent(IntPtr child, IntPtr newParent); [DllImport("user32.dll")] static extern int SendMessage(IntPtr h

我试图在windows窗体中运行discord.exe,但我收到了此错误。谁能帮帮我,谢谢。以下是错误消息:英语错误消息(“系统找不到指定的文件”)

这是我的密码:

[DllImport("user32.dll")]
    static extern IntPtr SetParent(IntPtr child, IntPtr newParent);
    [DllImport("user32.dll")]
    static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int Iparam);
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool IsWindowVisible(IntPtr hWnd);
    private const int WM_SYSCOMMAND = 274;
    private const int SC_MAXIMIZE = 61488;


    private void button1_Click(object sender, EventArgs e)
    {
        string anan = "discord.exe";
        Process calistir = Process.Start(anan);
        while (calistir.MainWindowHandle == IntPtr.Zero || !IsWindowVisible(calistir.MainWindowHandle))
        {
            System.Threading.Thread.Sleep(10);
            calistir.Refresh();
        }

        SetParent(calistir.MainWindowHandle, this.Handle);
        SendMessage(calistir.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);

    }

如果你想运行软件,首先你必须给出文件的路径。我更改了代码,但您必须根据计算机上的信息进行更改。那就行了

您可以在此处看到屏幕截图:Discord App=>Properties


我假设消息说:系统找不到指定的文件(顺便说一句,您应该以文本形式提供异常详细信息,英语)。使用可执行文件的完整路径——通常,您可以使用
[Process].WaitForInputIdle()
等待进程的接口显示(如果是窗口化进程)。所以,在循环过程中删除
——不能保证
SetParent
会产生期望的结果。是的,你是对的。它说“系统找不到指定的文件”谢谢,顺便说一句,我将编辑此消息的帖子。但是我不能使用可执行文件的完整路径,因为其他人可以更改位置。它将是一个发射器@JimiYou必须以某种方式使用完整路径。所以,在注册表中查找可执行路径。是的,我试过了,我试过这个:“C:\Users\Hasancan\AppData\Local\Discord\app-0.0.305\Discord.exe”我试过这个?那根绳子是从哪里来的?从查找中?在注册表中查找可执行路径当然意味着使用开发工具,而不是您的眼睛:)(您必须知道应用程序在注册表中存储其路径的位置,并在运行时检索此路径)感谢Bayram,我尝试了此方法,但得到了相同的错误。还有一件事你应该检查一下:
string anan = @"C:\Users\YouPC\AppData\Local\Discord\Discord.exe";
Process calistir = Process.Start(anan);
while (calistir.MainWindowHandle == IntPtr.Zero || 
    !IsWindowVisible(calistir.MainWindowHandle))
{
    System.Threading.Thread.Sleep(10);
    calistir.Refresh();
}

SetParent(calistir.MainWindowHandle, this.Handle);
SendMessage(calistir.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);