请问程序终止时所发的Message?(100分)

  • 主题发起人 主题发起人 zhancj
  • 开始时间 开始时间
Z

zhancj

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:<br>&nbsp; 我现在开发一个程序,通过一个Delphi程序来监视另一个程序的运行<br>情况,需要在该程序终止时立即重启,不知道该message是什么?请有知道着<br>告知!
 
用一个线程检测该程序的Process ID
 
var<br>OFile:String;<br>HWndCalculator : HWnd;<br>begin<br>HWndCalculator := FindWindow(nil, '计算器'); <br>// 以 '计算器' 为例:此处是按[标题]查找,如果另一程序也是你做的就更简单了<br>// 只需要监视[CloseQuery]就可以了<br>if (HWndCalculator = 0) then<br>&nbsp; begin<br>&nbsp; &nbsp; OFile:='C:/WINDOWS/CALC.EXE';<br>&nbsp; &nbsp; Shellexecute(handle,'Open',pchar(OFile),nil, <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pchar(ExtractFilePath(OFile), SW_SHOWNORMAL);<br>&nbsp; end;<br>end;<br><br>
 
用FindWindow()似乎不是很好吧!他现在可以查找其他的进程的窗口了么?<br><br>很就没有用过了。
 
你应该接管系统消息:WM_QueryEndSession。
 
应该用CreateProcess加WaitforSingleObject
 
我也有相同的问题<br>但是希望能够检测到当程序被ctrl+alt+del中关掉时<br>能够重新启动程序<br>
 
作一个WH_SHELL的钩子就可以了。<br>监视HSHELL_WINDOWDESTROYED。
 
我要监视的程序是多个Console程序,我用Winsight看了半天,还没有找着它们的运行时Name(好象不是*.exe),程序是用老式的C语言开发的。我觉得可能能利用Hook来做,可是不知道具体的例子,望各位大虾赐教!
 
我也曾有过此问题,如有人回答请通知我一下
 
我觉得有点奇怪,这个问题很简单呀! 我说的应该没问题的,<br>CreateProcess加WaitforSingleObject就足够了<br><br>//以edit.com为例<br>procedure RunFile;<br>var<br>&nbsp; StartupInfo:TStartupInfo;<br>&nbsp; ProcessInfo:TProcessInformation;<br>begin<br>&nbsp; FillChar(StartupInfo,Sizeof(StartupInfo),#0);<br>&nbsp; StartupInfo.cb := Sizeof(StartupInfo);<br>&nbsp; StartupInfo.dwFlags := STARTF_USESHOWWINDOW;<br>&nbsp; StartupInfo.wShowWindow := sw_normal;<br>&nbsp; CreateProcess(nil,'C:/WINDOWS/COMMAND/edit.com',<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nil, nil,false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nil, nil,StartupInfo, ProcessInfo);<br>&nbsp; while true do<br>&nbsp; begin<br>&nbsp; &nbsp; //注意你要考虑如何从这个死循环里面退出<br>&nbsp; &nbsp; WaitforSingleObject(ProcessInfo.hProcess,INFINITE);<br>&nbsp; &nbsp; CreateProcess(nil,'C:/WINDOWS/COMMAND/edit.com',<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nil, nil,false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nil, nil,StartupInfo, ProcessInfo);<br>&nbsp; end;<br>end;<br>如果要同时监测多个exe程序,用线程可能就可以解决了.<br><br>是不是我还没有理解你的意思?
 
一直用findwindow找目标程序的窗口,一旦找不到就是被关闭了。<br>然后重启动。<br>var a:Thandle;<br>begin<br>&nbsp; repeat<br>&nbsp; a:=findwindow(nil,'窗口标题');<br>&nbsp; if a=0 then //找不到<br>&nbsp; &nbsp; &nbsp; exitwindowsex(EWX_REBOOT or EWX_FORCE,0); &nbsp; &nbsp; <br>&nbsp; until a&lt;&gt;0;<br>end;
 
shellexecute(handle,'Open',pchar(OFile),pchar(ExtractFilePath(OFile),nil, SW_SHOWNORMAL)<br>是不是该这麽写呢?请大虾确定一下.
 
同意www。我觉得用个Timer,不停的用FindWindow<br>监视就可以了。没发现制定的程序运行,就运行它。<br>
 
1."Console程序"用findwindow有用吗?<br>2.用timer太浪费资源了吧??
 
大家相信CaKK吧.这是正解
 
谢谢各位的热心帮助,并特别感谢cAkk的解答。因为这个程序要放在Server上,所以要求占用资源很少,我原来考虑用消息,没有考虑用同步对象。
 
后退
顶部