两大疑问,敬请各位帮忙!谢谢!!

nisazhixin 2004-10-26 04:32:08
我编了个关联exe文件的程序,但不知道怎么退出windows
每当运行一个exe文件,我的程序就会运行,于是找到一篇
防止一个程序二次运行的文章,并严格照做,结果——程序一次
也不运行了
总结一下,两问:1。怎么让监控程序关联exe文件后能正常退出windows??
2。怎样让一个程序只运行一次,而且能运行一次
请各位高手帮忙!!谢谢了!!!!
...全文
175 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolpal 2004-12-02
  • 打赏
  • 举报
回复
路过,学习
nisazhixin 2004-11-30
  • 打赏
  • 举报
回复
热切期盼高手帮忙!
nisazhixin 2004-11-29
  • 打赏
  • 举报
回复
请大家帮忙啊,谢谢!!!!!!!!!
nisazhixin 2004-11-25
  • 打赏
  • 举报
回复
谢顶!
继续郁闷、漫长、急切地等待
不知高手何时出现,期盼着
heart007 2004-11-25
  • 打赏
  • 举报
回复
我也太想知道答案了,帮顶
nisazhixin 2004-11-25
  • 打赏
  • 举报
回复
急切等待ing
heart007 2004-11-24
  • 打赏
  • 举报
回复
高手睡觉了??
heart007 2004-11-24
  • 打赏
  • 举报
回复
还没解决?帮顶!
nisazhixin 2004-11-24
  • 打赏
  • 举报
回复
看来太难了,郁闷ing
nisazhixin 2004-11-01
  • 打赏
  • 举报
回复
由于本贴问题实在不容易解决,
强烈请求版主 将本贴置顶,让大家一起讨论
先谢过了!!
heart007 2004-10-28
  • 打赏
  • 举报
回复
也想知道,帮顶
nisazhixin 2004-10-28
  • 打赏
  • 举报
回复
方法三98下有时可以,有时不可以:当我去掉‘showmessage('该程序已经运行了!')’后,程序就一
次也不运行,而加上那句后,又可运行,反复试了几次都这样,简直像是天方夜谭,可偏偏发生了
郁闷的是在实际使用中,不可能保留那句的
请各位高手指点一下!!在次先谢过了!!
nisazhixin 2004-10-28
  • 打赏
  • 举报
回复
各位高手快来帮帮忙啊!谢谢了!
nisazhixin 2004-10-27
  • 打赏
  • 举报
回复
第一个方法和第二个一样:第一次运行时就说‘程序已经运行’,可我仔细查过了
程序根本就没运行
请问这是怎么回事?请帮我想想,谢谢了!!
我再试试第三个
nisazhixin 2004-10-26
  • 打赏
  • 举报
回复
刚试了方法二,结果编译通过,可当我把它关掉再运行,就一次也不运行了
请问这是什么原因??
另外,方法三的代码是加在哪?.dpr内吗?
方法一还没来得及试,要下班了
明天来看你们的好消息
在次先谢谢了!!!
nisazhixin 2004-10-26
  • 打赏
  • 举报
回复
我试试先,并继续等待大家帮忙
先谢了!!
suuare 2004-10-26
  • 打赏
  • 举报
回复
推荐楼上的方法3 使用排斥机制
ksaiy 2004-10-26
  • 打赏
  • 举报
回复
第二问题:
方法:
procedure LookForPreviousInstance;
var
PreviousInstanceWindow : hWnd;
AppName : array[0..30] of char;
FoundAtom : TAtom;
begin
AtomText:='OnlyOne'+Application.title;
FoundAtom := GlobalFindAtom(PChar(AtomText));
if FoundAtom <> 0 then
begin
ShowMessage('该程序已经远行了!');
StrFmt(AppName,'%s', [Application.Title]);
Application.ShowMainForm := false;
Application.Title := 'destroy me';
PreviousInstanceWindow := FindWindow(nil,AppName);
Application.Terminate;

if PreviousInstanceWindow <> 0 then
if IsIconic(PreviousInstanceWindow) then
ShowWindow(PreviousInstanceWindow,SW_RESTORE)
else SetForegroundWindow(PreviousInstanceWindow);
end;
FoundAtom := GlobalAddAtom(PChar(AtomText));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
inherited;
LookForPreviousInstance;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
FoundAtom : TAtom;
ValueReturned : word;
begin
FoundAtom := GlobalFindAtom(Pchar(AtomText));
if FoundAtom <> 0 then ValueReturned := GlobalDeleteAtom(FoundAtom);
// inherited Destroy;
end;


方法二:
procedure TForm1.FormCreate(Sender: TObject);
begin
if GlobalFindAtom('PROGRAM_RUNNING') = 0 then
fAtom := GlobalAddAtom('PROGRAM_RUNNING')
else
begin
ShowMessage('该程序已经运行了!');
Halt;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
GlobalDeleteAtom(fAtom);
end;


方法三:
initialization
Project:='RunOnlyOnce_MyProject';
mHandle:=CreateMutex(nil,True,PChar(Project));
if GetLastError=ERROR_ALREADY_EXISTS then
begin
ShowMessage('该程序已经运行了!');
AppName:=Application.Title;
Application.ShowMainForm:=False;
Application.Title:='destroy me';
PreviousInstanceWindow:=FindWindow(nil,PChar(AppName));
if PreviousInstanceWindow<>0 then
if IsIconic(PreviousInstanceWindow) then
ShowWindow(PreviousInstanceWindow,SW_RESTORE)
else
SetForegroundWindow(PreviousInstanceWindow);
Application.Terminate;
end;
finalization
if mHandle<>0 then
CloseHandle(mHandle);

5,387

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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