delphi如何实现只运行一个实例,且激活第一个实例中的某个窗体?

lhybird 2009-03-20 05:46:47
只运行一个实例的代码我有了,

begin
Application.Initialize;
//只运行一个程序
hAppMutex := CreateMutex(nil, false, PChar('MantPlan')); //创建互斥对象
if hAppMutex = 0 then
begin
//showmessage('dfdfd');
MessageBox(0, PChar('创建互斥对象失败!'), PChar('Error'), MB_OK + MB_ICONINFORMATION);
exit;
end;
//查看是否是第一次运行程序
if ((hAppMutex <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS)) then
begin
MessageBox(0, PChar('程序已经运行!'), PChar('OK'), MB_OK + MB_ICONINFORMATION);
//关闭互斥对象,退出程序
//form2.Show;
closeHandle(hAppMutex);

exit;
end;

Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm3, Form3);
Application.CreateForm(TForm4, Form4);
Application.Run;

CloseHandle(hAppMutex); //关闭互斥对象

end.

如何在二次执行这个程序时,激活这个程序已运行的那个实例的某个窗口(如form2)呢?
...全文
289 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhybird 2009-08-15
  • 打赏
  • 举报
回复
但是第一次运行的程序所有窗口都关闭了,只在系统托盘上驻图标.现在要它把窗口显示出来.
liangpei2008 2009-03-20
  • 打赏
  • 举报
回复

1. hAppMutex := CreateMutex(nil, false, '');//最好用GUID ,因为Mutex为跨进程的,万一在同一服务器上运行另一个程序,是用Mutex来实现多线程互斥的,你的程序就运行不了了!
2. 激活某窗体参见F1
  • 打赏
  • 举报
回复
楼上的方法可行。也可以用 SetForegroundWindow 函数。
starluck 2009-03-20
  • 打赏
  • 举报
回复




Var
A: Hwnd;

A := FindWidows(nil,'窗口名');
if A <> 0 then ShowWindow(A,SW_SHowNormal);



意思是這樣的,沒有開發環境,可能有筆誤,見諒

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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