怎样让程序重复运行时自动转到已有的实例中(简单点儿)?

wyj 2000-01-03 11:49:00
我知道可以用加全局原子的方法让程序不会同时运行两次,但有时明明已经告诉用户“对不起,程序已经在运行中,请不要再运行一次”,可用户就是找不到已经运行的程序在哪儿,我想最好的办法就时一旦发现程序已经在运行中就自动转到已经有的实例中,而不是显示一个信息那么不友好,我该怎么做呢?最方便的方法是什么?
...全文
253 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyb 2000-01-06
  • 打赏
  • 举报
回复
有关这个问题的技巧好象大多数有关DELPHI网站上都有讲过,何不自己花点时间去探寻一番呢?
spear 2000-01-05
  • 打赏
  • 举报
回复
有好几种方法
dpr如下:
var
HMutex: HWnd;

begin
GlobalMsg:=RegisterWindowMessage(PChar('文正明分机管理器已经运行'));
HMutex:=CreateMutex(nil,False,PChar('pwzmUsrMgr'));
if WaitForSingleObject(HMutex,100)=WAIT_TIMEOUT then
PostMessage(HWND_BROADCAST,GlobalMsg,0,0)
else
begin
Application.Initialize;
Application.Title := '分机管理器';
Application.CreateForm(TFrmMainStation, FrmMainStation);
Application.Run;
ReleaseMutex(HMutex);
end;
CloseHandle(HMutex);
end.

主窗口.pas
var
FrmMainStation: TFrmMainStation;
GlobalMsg: UINT;

procedure TFrmMainStation.OnAppMessage(var Msg:TMsg; Var Handled:Boolean);
begin
if Msg.message=GlobalMsg then
begin
Show;
WindowState:=wsNormal;
BringToFront;
SetFocus;
Handled:=True;
end;
end;

procedure TFrmMainStation.FormCreate(Sender: TObject);
begin
Application.OnMessage:=OnAppMessage;
end;
kxy 2000-01-04
  • 打赏
  • 举报
回复
win32中preinstance已经没有意义,比较简单的方法思路是,
使用FindWindow函数来查找你的主Form是否已经创建.
FindWindow(

LPCTSTR lpClassName, // pointer to class name // 你的Form的类名TForm1等.
LPCTSTR lpWindowName // pointer to window name//可以为空 nil
);
返回你的Form的handle ,在使用 setwindowpos(handle,....)把你的程序防到最
上面. 但是 在 IDE环境中,此方法不灵,因为Delphi已经打开了你的主Form.
这些判断都放在dpr中.
//另一个方法复杂一些,在你的dpr中 使用临界区,可以创建一个Mutex Objects
具体方法请参看window api的帮助.这时可以判断是否程序已经执行.
然后在使用FindWindow和setwindowpos
tiger 2000-01-04
  • 打赏
  • 举报
回复
MapFile、文件映射及注册器都不是个好办法, 如果我强行关机怎么办?
我觉得MemoryMap应该是个好主意.
barton 2000-01-04
  • 打赏
  • 举报
回复
kxy的方法是可行的.不过不总是正确,因为用MainForm的Caption找窗口不总是
有效的方法.kxy的方法有一个现成的控件,并且能够激活上一个实例.

最可靠的办法是建立MapFile,文件映射或者用注册器,关键是一旦运行程序首
先要将Application的Handle保存起来,而退出后再抹去保存的句柄.第二份实
例运行时,如果我个句柄存在则读出这个句柄并用Win32API激活.
【为什么学习微信小程序?】   小程序开发为当下一种主流的开发形式,小程序开发已经不仅仅局限于互联网行业,传统行业同样也有海量的需求,掌握小程序开发不仅仅是掌握了一个新的开发技能,更可以增加大家的行业竞争力,无论是在岗位的提升,求职面试、或者个人创业都是有很大的帮助。掌握了小程序开发小程序也是一门相对比较容易上手的技术,因为小程序开发容纳了前端、后端、运维等岗位所需掌握的知识但又极为简单好理解,对于刚刚入门或者小白用户是一个可以快速掌握并成为一名程序猿的不二途径。 【推荐你学习这门课程的四大亮点】 1、完整成体系的小程序开发知识: 对于没有学习过小程序开发的同学,本课程由浅入深系统的向同学们讲解了小程序开发知识,将知识点串联起来,让同学们可以更好更快的掌握小程序开发。2、视频及相关功能开发的掌握: 借助于小程序开发使得视频方向的开发变的尤为简单,即使你是入门小白也可以熟练掌握小程序视频的相关开发,其涉及了视频的常规控制如播放暂停等也有比较流行的视频弹幕功能,并结合了一下视频开发相关的性能优化问题,可以让同学们通过本课程的学习对于视频类的开发有更深层次的认识。3、打造智能闲聊小程序: 借助于网络上开放的人工智能接口,去实现智能闲聊功能,使得开发的过程不仅能够收获更多的知识也变得更加有趣。项目虽然知识讲解了智能闲聊功能的调用,但是通过此功能的调用方法大家可以举一反三去使用更多的开发功能使得开发变得简单且有趣。4、掌握项目级开发知识及技巧: 本课程融入了两大当前比较主流的项目实例,视频功能和人工智能。通过项目的练习不仅可以让大家掌握较为主流的项目方向且融入很多的高级语法及项目开发知识,如ES6+的一些语法和模块化、组件化开发的知识。【课程内容设计】   设计本门课程时考虑到很多同学可能没有小程序开发相关经验,本门课程将由浅入深,渐进式的讲解知识点。我把课程分为了三个阶段分别为:初次接触、基础入门、实战提升。   1、初次接触:   主要给大家讲解小程序开发的相关知识,让大家在宏观上对向程序开发能有一定的概念。并且讲授的开发环境的搭建让大家对在开发前期做一个充分的热身。先激发起大家对线程序开发的热情,这样为下一步小程序的开发学习做一个铺垫。   2、基础入门:   这个阶段主要为入门的同学提供了一个比较全面的小程序开发基础知识知识汇总,并伴有实践的例子简单且易上手,让大家能够体验到小程序的开发乐趣,并未下一步的项目实战开发打定基础。   3、实战提升:   这个阶段为项目实践阶段,通过实战项目让大家深入了解和学习小程序开发,项目同时融入了现在主流的视频内容,和有趣并贴近生活的智能闲聊功能,项目涉及到的技术点也是由浅入深,同学们在掌握小程序的开发能力的同时也掌握了问题解决与深入学习的能力。 【实战项目展示】 【学习完课程你将收获】

5,392

社区成员

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

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