控制程序运行一次

假设应用程序名称为d7.exe,双击程序图标 ,假如该程序已经运行了(只是最小化而已),则怎样把程序窗口最大化?谢谢各位大虾
网友回复: 程序里面你向最大话的地方写:WindowState:=wsMaximized;

或者 SendMessage(Handle,WM_SYSCOMMAND,SC_MAXIMIZE,0);发消息
网友回复:能具体点吗,我的要求就是双击图标时,只能运行一个相同的程序,假如已经存在并最小了,则把他最大化,仅此而已
网友回复: 假如是所有窗口都要最大话的话,你应该在程序里面都设置好为最大话。WindowState属性为wsMaximized;

假如需要判定某个窗口在不是最大话的情况下,要其最大话显示。

if Form1.WindowState <> wsMaximized then
self.WindowState:=wsMaximized

OK

网友回复: 双击图标的时候执行的第一个事件是主窗口的Creat,还有一个主窗口的FormShow也是比较早执行的。假如你实在不想设计的时候就最大话,而是,向用代码写的话。。。。。。除非你有毛病。

在主窗口的FormSHoW里写上无数个
if Form1.WindowState <> wsMaximized then
self.WindowState:=wsMaximized

if Form2.WindowState <> wsMaximized then
self.WindowState:=wsMaximized

。。。。。。
网友回复:private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
//保存Mutex句柄
mHandle:THandle;
PreviousInstanceWindow:HWnd;
Project:String;
AppName:String;
implementation

{$R *.dfm}
initialization
//定义自己的项目名称,作为要创建的互斥区名,最好有自己的特点以防止重复
Project:='RunOnlyOnce_MyProject';
//将lpMutexAttributes设为nil,bInitialOwner设为True(即本程序拥有该互斥区)


mHandle:=CreateMutex(nil,True,PChar(Project));
if GetLastError=ERROR_ALREADY_EXISTS then
//该互斥区已存在则表明已有本程序的另一个实例在运行
begin
ShowMessage('已经有该程序在运行');
//保存程序标题
AppName:=Application.Title;
//不显示本窗口
Application.ShowMainForm:=False;
//改变程序标题,以使函数FindWindow找到的是前一个实例窗口
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);
end.

Windows 下一个典型的特征就是多任务,我们可以同时打开多个窗口进行操作,也可以同时运行程序的多个实例,比如可以打开许多个资源管理器进行文件的移动复制操作。但有时出于某种考虑(比如安全性),我们要做出一些限制,让程序只能够运行一个实例。在Delphi编程中,笔者总结出了以下几种方法:
  一、 查找窗口法
  这是最为简单的一种方法。在程序运行前用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到了,就说明已经存在一个实例。在项目源文件的初始化部分添加以下代码:
  Program OneApp
  Uses
  Forms,Windows;(这里介绍的几种方法均需在项目源文件中添加Windows单元,以后不再重复了)
  Var Hwnd:Thandle;
  Begin
   Hwnd:=FindWindow(‘TForm1’,‘SingleApp’);
   If Hwnd=0 then
   Begin
   Application.Initialize;
   Application.CreateForm(Tform1, Form1);
   Application.Run;
   End;
  End;
  FindWindow()函数带两个参数,其中的一个参数可以忽略,但笔者强烈建议将两个参数都用上,免得凑巧别的程序也在使用相同的类名,就得不到正确的结果了。另外,如果是在Delphi IDE窗口中运行该程序,将一次都不能运行,因为已经存在相同类名和标题的窗口:设计时的窗体。
  二、使用互斥对象
  如果觉得查找窗口的方法效率不太高的话,可以使用创建互斥对象的方法。尽管互斥对象通常用于同步连接,但用在这个地方也是非常方便的。仅用了4句代码就轻松搞定。
  VAR Mutex:THandle;
  begin
   Mutex:=CreateMutex(NIL,True,‘SingleApp’);
   IF GetLastError<>ERROR_ALREADY_EXISTS THEN//如果不存在另一实例
   BEGIN
   Application.CreateHandle;
   Application.CreateForm (TExpNoteForm, ExpNoteForm);
   Application.Run;
   END;
   ReleaseMutex(Mutex);
  end.
  三、全局原子法
  我们也可以利用向系统添加全局原子的方法,来防止多个程序实例的运行。全局原子由Windows 系统负责维持,它能保证其中的每个原子都是唯一的,管理其引用计数,并且当该全局原子的引用计数为0时,从内存中清除。我们用GlobalAddAtom 函数向全局原子添加一个255个字节以内的字符串,用GlobalFindAtom来检查是否已经存在该全局原子,最后在程序结束时用GlobalDeleteAtom函数删除添加的全局原子。示例如下:
  Uses Windows
  const iAtom=‘SingleApp’;
  begin
   if GlobalFindAtom(iAtom)=0 then
   begin
   GlobalAddAtom(iAtom);
   Application.Initialize;
   Application.CreateForm(TForm1,Form1);
   Application.Run;
   GlobalDeleteAtom(GlobalFindAtom(iAtom));
   end
   else
   MessageBox(0,‘You can not run a second copy of this App’,‘’,mb_OK);
  end.
  利用全局原子的引用计数规则,我们还可以判断当前共运行了该程序的多少个实例:
  var i:Integer;
  begin
   I:=0;
  while GlobalFindAtom(iAtom)<>0 do
   begin
   GlobalDeleteAtom(GlobalFindAtom(iAtom));
   i:=i+1;
   end;
   ShowMessage(IntToStr(I));
  end;
  以上几种方法在笔者的Delphi 7.0,中文Windows2000,XP下通过。——————有兴趣的朋友可以测试一下其它平台的运行状况  


 

你可能感兴趣的:(控制程序运行一次)