如何将已经显示的非模态窗口转为模态窗口?(100分)

  • 主题发起人 主题发起人 Adnil
  • 开始时间 开始时间
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
已知窗口的hwnd<br><br>典型用例:WinExec('notepad.exe'...),将记事本的窗口转为调用程序的模态窗口。
 
模式窗口是相对一个进程而言的,不能跨进程激活另一个进程而挂起自己的进程<br>变通的方法是你启动 notepad 后,把它设在最前端<br>&nbsp; &nbsp; &nbsp; &nbsp; Hnd := FindTopLevelWin('记事本');<br>&nbsp; &nbsp; &nbsp; &nbsp; SetWindowPos(Hnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SWP_NOSIZE or SWP_NOACTIVATE);<br>然后把自己窗口冻结(form1.enabled := false),<br>然后循环检查 notepad 是否运行结束(句柄),然后把自己解冻
 
用shellexecute实施,我记得以前用vb写程序是解决过这样的问题,不是把另外的可执行程序专程模态窗口,而是当前程序等待被调用程序执行结束。<br>好久没用vb了,你自己找找看吧!<br>
 
只能像轻松虎说的那样了。利用变通的方法,模仿模态
 
发现轻松虎真有实才,厉害。佩服。。。
 
to adnil:<br>&nbsp; 我已找到VB的程序,可以等调用的程序关闭后,才执行自己的程序。如果你要的话。<br>告诉一声:<br>mike6912@sina.com<br>
 
如果目标窗口是你自己运行起来的,可以用 CreateProcess 和 WaitForSingleObject<br>来代替循环检测,比较正规:)<br>不过如果你的程序启动时,目标窗口已经启动,则只能用循环检测的方式了:(<br>至于设置为 TopMost 如楼上所述。
 
to adnil:<br>&nbsp; Delphi的程序也写好了。<br>这栋栋以前我做过,主要是想实现调用其他应用程序,其他应用程序结束后还有一些必要的处理。<br>vb中很好实现,delphi稍微有点南,但已解决了。<br>现在我可以仿真模态窗口,也可以就是非模态的,但调用其他应用程序之后的代码,一定会等到调用结束后才被执行。<br>有兴趣的话,说一声。<br>
 
to MikeZ:<br>&nbsp; 非常感谢!我的邮箱是adnilzhou@sohu.com<br><br>还有一点我可能忘了说了,有可能是执行一个程序,也有可能是调用某一个系统api,<br>从而得控制该api所显示的非模态窗口(例如文件的属性窗口)。
 
to Adnil:<br>已经发了!
 
接受答案了
 
后退
顶部