📄 056.htm
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI专题文档-程序应用-->避免一个程序二次运行</TITLE>
<META NAME="keywords" CONTENT=" DELPHI专题文档-程序应用 避免一个程序二次运行">
<META NAME="description" CONTENT=" - DELPHI专题文档-程序应用 - 避免一个程序二次运行">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<a href="index6.html">返回</a>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">避免一个程序二次运行</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p align="left"><span class="tt2">实现单实例运行的关键是判断前一实例是否存在,Win3.x中运行的程序能获知前一实例的句柄,从而可以方便地进行判断,但
Windows 95
是抢先式多任务系统,其程序的前一实例句柄恒为零,所以只有另寻其他办法。目前最有效的办法是通过查看是否有相同窗口类名的例程存在来进行判断。下面介绍在Delphi中实现的方法。<br>
<br>
1、对主窗口程序的改动:<br>
<br>
在主窗口(即程序创建的第一个窗口)中interface节加入<br>
const<br>
CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}<br>
MYAPPNAME = "My Delphi Program";<br>
并在Form的定义的public节中加入<br>
procedure CreateParams(var Params: TCreateParams); override;<br>
Procedure RestoreRequest(var message: TMessage); message CM_RESTORE;<br>
在implementation节中加入<br>
{指定窗口名称}<br>
procedure TForm1.CreateParams(var Params: TCreateParams);<br>
begin<br>
inherited CreateParams(Params);<br>
Params.WinClassName := MYAPPNAME;<br>
end;</span></p>
<p align="left"><span class="p2">{处理“恢复”消息}<br>
procedure TForm1.RestoreRequest(var message: TMessage);<br>
begin<br>
if IsIconic(Application.Handle) = TRUE then<br>
Application.Restore<br>
else<br>
Application.BringToFront;<br>
end;<br>
<br>
经过以上修改,程序的主窗口的类名已经被指定了,这是进行判断的基础。一般在程序刚开始运行的时候进行判断,所以还要对DPR文件进行修改。<br>
<br>
2、对DPR文件的改动<br>
<br>
在 uses 节中添加 windows、messages这两个单元加入下列语句,注意两个文件中常量CM_RESTORE和MYAPPNAME的定义必须一致<br>
const<br>
CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}<br>
MYAPPNAME = "My Delphi Program";<br>
var<br>
RvHandle : hWnd;<br>
<br>
将下列语句插到程序最前部(在Application.Initialize之前)<br>
<br>
RvHandle := FindWindow(MYAPPNAME, NIL);<br>
if RvHandle > 0 then<br>
begin<br>
PostMessage(RvHandle, CM_RESTORE, 0, 0);<br>
Exit;<br>
end;<br>
这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退出,而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行且能自动调出前一例程的目的。</span></p>
<hr color="#EE9B73" size="1" width="94%">
</TD>
</TR>
</table>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -