【问题标题】:Creating a child Process C# win32 API创建子进程 C# win32 API
【发布时间】:2014-08-26 03:06:56
【问题描述】:

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

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”桌面视图(活动桌面视图)中

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

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

任何指针?提前致谢!

【问题讨论】:

  • 当然不是。这样可以清楚地说明问题。
  • 您是如何说服记事本生成进程的?或者你可能在说谎。
  • 转到查看并单击帮助。它产生 help.exe

标签: c# winapi process wmi


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-12-08
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多