给定一个程序文件名,如果已经在运行,则直接将控制转过去,否则运行之(100分)

  • 主题发起人 主题发起人 憨憨
  • 开始时间 开始时间

憨憨

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现?
 
这就是"only one"的问题嘛,用这个1k的小东东就解决了:<br>http://www.utilmind.com/delphi/justone.zip<br>其实好多大的控件包里都有类似的东东。
 
感谢louhong的回复。<br>不过,我的意思是执行外部程序,给定任意一个程序的文件名,首先检查是否已经运行,<br>如果已经运行就直接转过去,否则就运行它。
 
通知我一下
 
procedure TfmMain.FormCreate(Sender: TObject);<br>const<br>&nbsp; &nbsp;csForm='aaa';<br>begin<br>&nbsp; if HasExecutingInstance(csForm) then<br>&nbsp; begin<br>&nbsp; &nbsp; showmessage('程序已经运行!');<br>&nbsp; &nbsp; Application.Terminate;<br>&nbsp; end;<br>end;<br><br><br>function TfmMain.HasExecutingInstance(InstanceName: string): boolean;<br>var<br>&nbsp; &nbsp;MutexHandle: THandle;<br>begin<br>&nbsp; MutexHandle:=CreateMutex(nil, false, PChar(InstanceName));<br>&nbsp; Result:=GetLastError &lt;&gt; 0;<br>end;
 
还是不行啊<br>我要执行的外部程序是任意的,而且可以由我的程序启动,也可以由用户以其它任何方式启动,<br>我只要发现已经运行了,就把它的窗口调到前面来,如果没有运行,我的程序就启动这个程序<br>例如,Windows的画图程序MSPAINT.EXE,用户可以从Windows开始菜单的附件中启动,所以用<br>CreateMutex不能发现已经运行了
 
解决方法发过去了,看见没?
 
杰克:<br>????
 
枚举进程,然后从进程获得文件名进行比较。
 
实际上,我就是这样处理的:<br>首先枚举进程确定是否已运行,并获得进程ID;<br>然后再枚举窗口,对每个窗口调用GetWindowThreadProcessId获得窗口所属进程ID,从而取得进程的窗口;<br>最后调用SetForegroundWindow将控制转过去。<br><br>但是,我的上司(也是一个蛮厉害的程序员)说太麻烦了,应该有更直接更简单的方法,我也希望有个什么API可以直接实现这一功能。<br><br>另外,还存在一个问题,SetForegroundWindow后,窗口是被带到前面来了,但好像没有获得焦点似的,窗口标题颜色没有变成活动窗口的颜色,不知是为什么。<br>
 
1.您可以直接向上司请教,或许他和 user.exe 关系特别好也难说.<br>2.您可以再发送一个窗口活动消息
 
to 小雨哥:<br>1.他要是知道就告诉我了<br>2.试过了还是不行
 
//执行外部程序,给定任意一个程序的文件名,首先检查是否已经运行<br>这样行不行,如果这个程序不是被别的程序占用,而且已经运行了。<br>应该不可以改名字吧。<br>不能改名字的,就运行算了
 
yuki2003的注意可以,首先最好判断指定的文件是否存在
 
看了以下程序你就明白了!!!!!!!!<br><br>85. 获得进程列表,并终止 Excel 进程<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; FSnapshotHandle:THandle;<br>&nbsp; FProcessEntry32:TProcessEntry32;<br>&nbsp; Ret : BOOL;<br>&nbsp; ProcessID : integer;<br>&nbsp; s:string;<br>begin<br>&nbsp; FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);<br>&nbsp; FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);<br>&nbsp; Ret:=Process32First(FSnapshotHandle,FProcessEntry32);<br>&nbsp; Memo1.clear;<br>&nbsp; while Ret do<br>&nbsp; begin<br>&nbsp; &nbsp; Memo1.lines.add(FProcessEntry32.szExeFile);<br>&nbsp; &nbsp; s:=ExtractFileName(FProcessEntry32.szExeFile);<br>&nbsp; &nbsp; if s='EXCEL.EXE' then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; ProcessID:=FProcessEntry32.th32ProcessID;<br>&nbsp; &nbsp; &nbsp; TerminateProcess(OpenProcess(PROCESS_TERMINATE,false,ProcessID),1);<br>&nbsp; &nbsp; &nbsp; s:='';<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; Ret:=Process32Next(FSnapshotHandle,FProcessEntry32);<br>&nbsp; end;<br>end;<br><br>
 
看来没有什么更直接的办法了
 
function isfileinuse(fn:string):boolean;<br>var hfileres:hfile;<br>begin<br>result:=false;<br>if not fileexitsts(fn) then exit;<br>hfileres:=createfile(pchar(fn),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);<br>result:=(hfileres=INVALID_HANDLE_VALUE);<br>if not result then closehandle(hfileres);<br>end;<br>
 

Similar threads

S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
S
回复
0
查看
894
SUNSTONE的Delphi笔记
S
后退
顶部