通过Process打开一个应用程序,打开之后我想隐藏窗口,但是无效,大神来看看

subxli 2015-12-16 05:51:10

public bool checkhide{
string path = "C:\\Windows\\System32\\";
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
p.StartInfo.FileName = path + "calc.exe";
try
{
p.Start();
}
catch (Exception ex)
{
ErrorStr = ex.Message;
p.Kill();
return false;
}
finally
{
IntPtr intptr = p.MainWindowHandle;
ShowWindow(intptr, 0);
p.Dispose();
}
return true;
}
[DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);
...全文
1696 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsh115052 2017-03-27
  • 打赏
  • 举报
回复
你这样可以隐藏,却不能获取exe执行的结果返回
zhuxiaocan461 2017-03-12
  • 打赏
  • 举报
回复
引用 9 楼 qbilbo 的回复:
1,首先CreateNoWindow只对那些命令行程序有效。如果:cmd.exe。 (NoWindow理解成非消息循环程序可能更恰当) 2,如果要将CreateNoWindow设为true,那UseShellExecute必须为:false才有效。 3,想要使WindowStyle有效,UseShellExecute必须为:true。WindowStyle只对有UI界面的程序有效。(UseShellExecue默认为:true) 4,上述结论不是对所有程序有效,比如:calc.exe(你怎么就选中它来测试呢...),把calc.exe换成notepad.exe或Iexplore.exe或自己写个WinForm程序什么的就可以看到效果了。 5,瞎猜的。 UseShellExecute为true时可能是调用了WndMain,而那些不听话的程序都是因为没对第四个参数:ShowCmd做处理? 6,对于计算器这类不听话的家伙,好象只能System.Threading.Thread.Sleep(xxx)后ShowWindow了。但延迟多少时间是个问题,少了没用,多了界面会弹出来一会才隐藏。 7,一定要让它们听话,难道只能Hooker WM_SHOWWINDOW?这个只用C#貌似搞不定。
讲得很透彻,的确就是这么回事,我已经解决了 p.StartInfo.UseShellExecute = true; p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
qbilbo 2015-12-17
  • 打赏
  • 举报
回复
1,首先CreateNoWindow只对那些命令行程序有效。如果:cmd.exe。 (NoWindow理解成非消息循环程序可能更恰当) 2,如果要将CreateNoWindow设为true,那UseShellExecute必须为:false才有效。 3,想要使WindowStyle有效,UseShellExecute必须为:true。WindowStyle只对有UI界面的程序有效。(UseShellExecue默认为:true) 4,上述结论不是对所有程序有效,比如:calc.exe(你怎么就选中它来测试呢...),把calc.exe换成notepad.exe或Iexplore.exe或自己写个WinForm程序什么的就可以看到效果了。 5,瞎猜的。 UseShellExecute为true时可能是调用了WndMain,而那些不听话的程序都是因为没对第四个参数:ShowCmd做处理? 6,对于计算器这类不听话的家伙,好象只能System.Threading.Thread.Sleep(xxx)后ShowWindow了。但延迟多少时间是个问题,少了没用,多了界面会弹出来一会才隐藏。 7,一定要让它们听话,难道只能Hooker WM_SHOWWINDOW?这个只用C#貌似搞不定。
兔子-顾问 2015-12-17
  • 打赏
  • 举报
回复
p.Start() 后面加一句 System.Threading.Thread.Sleep(1000); 我这里试是有效的。但为什么看似可以的代码,无法检测,这个真狠奇怪。
正怒月神 2015-12-17
  • 打赏
  • 举报
回复
使用window service可以解决吗?
subxli 2015-12-17
  • 打赏
  • 举报
回复
@兔子党逍遥 那个方法好像不行,没作用,如果按你所说,我是否可以延迟几秒?
兔子-顾问 2015-12-17
  • 打赏
  • 举报
回复
刚启动,窗体创建需要时间的,你等创建好了,有消息循环了,再调用ShowWindow,否则你发的消息就被当垃圾扔了。
兔子-顾问 2015-12-17
  • 打赏
  • 举报
回复
p.Start(); 后面加一句: p.WaitForInputIdle(); 试一下
秋的红果实 2015-12-17
  • 打赏
  • 举报
回复
ProcessWindowStyle.Hidden好像做不到 那个要启动的应用程序,是你自己的吗?是的话,把他改成服务 或者最小化,或者让你的主程序界面在最前面,并最大化,这样将就了
shuiyuan622 2015-12-17
  • 打赏
  • 举报
回复
虽然解决不了,但是还是帮顶吧
subxli 2015-12-17
  • 打赏
  • 举报
回复
运行程序不能隐藏,断点调试的时候却能
Poopaye 2015-12-17
  • 打赏
  • 举报
回复
p.Start(); Thread.Sleep(2000); 亲测可行

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧