创建子进程C#win32 API

时间:2014-08-26 03:06:56

标签: c# winapi process wmi

我正在使用CreateProcess MSDN调用()来手动启动应用程序,这是我的代码

void LaunchProg()
{
    STARTUPINFO si = new STARTUPINFO();
    si.cb = Marshal.SizeOf(si);
    si.lpDesktop = "testProg";

    PROCESS_INFORMATION pi = new PROCESS_INFORMATION();

    var lpCurrentDirectory = Path.GetDirectoryName(executablePath);
    CreateProcess("c:\Windows\System32\notepad.exe", null, 
    IntPtr.Zero, IntPtr.Zero, true,
    NORMAL_PRIORITY_CLASS, IntPtr.Zero, lpCurrentDirectory, ref si, ref pi);
}

此代码工作正常并在指定的桌面“testProg”中启动程序,但问题是当notepad.exe创建具有新窗口的子进程时。此窗口显示在默认桌面中,而不是“testprog”桌面视图(活动桌面视图)

不确定在同一活动桌面中生成的所有子窗口的哪个参数设置不正确。我查看了文档,对我来说并不是更清楚。

观察更新:子进程不是从启动的应用程序继承而是从默认桌面运行的系统进程的子进程继承。

任何指针?提前谢谢!

1 个答案:

答案 0 :(得分:0)

MSDN documentation关于线程和桌面,如果在STARTUPINFO中指定了桌面,则使用该桌面,否则将使用进程所连接的Windows工作站的默认桌面。在您的情况下,似乎记事本不会将桌面的句柄标记为可继承,或者它正在执行不会继承句柄的CreateProcess。也许你可以附加一个调试器,看看调用CreateProcess的参数是什么?