psm*_*321 16 c# winapi frameworks process
我需要能够启动进程(控制台和窗口)而不会窃取焦点.我发现在.NET框架中执行此操作的唯一方法是使用Microsoft.VisualBasic.AppWinStyle的Microsoft.VisualBasic.Interaction.Shell.[Minimized | Normal] NoFocus(映射到SW_SHOWMINNOACTIVE/SW_SHOWMA传递给ShellExecute).
在我的代码的当前版本(它确实窃取焦点),我使用System.Diagnostics.Process,并依赖于我提供的一些功能,Interaction.Shell方法没有.
2个问题(一个严重,一个让我感到沮丧,我真的不希望得到一个好的答案)
1.)我是否正确,我别无选择,只能自己包装CreateProcess或ShellExecuteEx,或者我错过了其他一些解决方案?我真的希望避免这种情况,因为流程是这样除了这种疏忽了完整的和有用的包装,并有将实现这么多的功能,P/Invoke调用调试,以及各种配套的痛苦.
2.)为什么Microsoft的一个团队会创建这样一个(否则)完整的包装器,然后从ProcessWindowStyle中排除一半可能的值,而另一个团队创建了一个类似的包装器,它不太完整,但提供了所有有用的窗口样式?
Mik*_*son 12
VB.Net团队已经做了很多工作来为开发人员提供有关Windows工具的简化方法,我发现添加VB dll的引用并在C#程序中使用它没有问题.
这是两支不同重点的球队,就是这样.如果它解决了你的问题,你应该对使用Microsoft.VisualBasic.Interaction.Shell感到不舒服.
如果您不想引用dll,也可以使用Reflector查看实际实现并自己实现代码.
[编辑 - 在评论后添加代码示例,表明您可以组合Interaction.Shell和Process]
int pid = Interaction.Shell("notepad.exe", AppWinStyle.NormalFocus);
Process p = Process.GetProcessById(pid);
p.Exited += ((o, e) => Console.WriteLine("Exit"));
p.EnableRaisingEvents = true;
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
在这里,我使用Shell方法启动进程,从pid获取进程的句柄,并挂钩事件.您甚至可以执行p.Kill()以中止该过程.
[编辑 - cmd.exe的解决方法]
它开始变得有点像我的味道,但它的作用.用随机guid或其他东西替换"NEWWINDOW"以使其独特.
Microsoft.VisualBasic.Interaction.Shell(@"cmd.exe /c ""start cmd.exe /k title NEWWINDOW""", AppWinStyle.NormalFocus);
foreach (var process in Process.GetProcessesByName("cmd"))
{
if (process.MainWindowTitle.EndsWith("NEWWINDOW"))
{
process.Exited += ((o, e) => Console.WriteLine("Exit"));
process.EnableRaisingEvents = true;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8281 次 |
| 最近记录: |