假设应用程序名称为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下通过。——————有兴趣的朋友可以测试一下其它平台的运行状况