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

wyj 2000-01-03 11:49:00
我知道可以用加全局原子的方法让程序不会同时运行两次,但有时明明已经告诉用户“对不起,程序已经在运行中,请不要再运行一次”,可用户就是找不到已经运行的程序在哪儿,我想最好的办法就时一旦发现程序已经在运行中就自动转到已经有的实例中,而不是显示一个信息那么不友好,我该怎么做呢?最方便的方法是什么?
...全文
248 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激活.

5,388

社区成员

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

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