请问高手们,怎么样使我的程序不被运行二次, ( 积分: 50 )

  • 主题发起人 主题发起人 laobeli
  • 开始时间 开始时间
L

laobeli

Unregistered / Unconfirmed
GUEST, unregistred user!
[h1][/h1]请问高手们,怎么样使我的程序不被运行二次,也就是说,程序已经打开了,就不能再打开一个。高手快来啊,我程序就差这一步了,有代码或介绍的话请发邮件给我啊,急急急!!!!!!
 
[h1][/h1]请问高手们,怎么样使我的程序不被运行二次,也就是说,程序已经打开了,就不能再打开一个。高手快来啊,我程序就差这一步了,有代码或介绍的话请发邮件给我啊,急急急!!!!!!
 
//判断程序是否运行,s为Application.Title
function G_istwo(s:string):boolean;
var
hMutex:HWND;
Ret:Integer;
begin

hMutex:=CreateMutex(nil,False,pchar(s));
Ret:=GetLastError;
If Ret<>ERROR_ALREADY_EXISTS then

result:=true
else

result:=false;
ReleaseMutex(hMutex);
end;
 
program Project1;

uses
Windows,
Messages,
Forms,
Unit1 in 'Unit1.pas' {Form1};

var
v_Hwnd:HWND;

{$R *.res}

begin

v_Hwnd:=FindWindow('TForm1',nil);
if v_Hwnd = 0 then

begin

Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else

begin

Application.MessageBox('系统已运行中','提示',MB_OK);
SetForeGroundWindow(v_Hwnd);
Halt(0);
end;

end.


调试时需关闭相应工程
窗体类名最好特殊一些
 
// Project1.dpr //
program Project1;

uses
Forms,
messages,
windows,
Unit1 in 'Unit1.pas' {Form1};

const
CM_RESTORE = WM_USER + $1000;
MYAPPNAME = 'My Delphi Program';
var
RvHandle : hWnd;
{$R *.RES}

begin

RvHandle := FindWindow(MYAPPNAME, NIL);
if RvHandle > 0 then

begin

PostMessage(RvHandle, CM_RESTORE, 0, 0);
Exit;
end;


Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.



// Unit1.pas //
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

const
WM_BARICON=WM_USER+200;
CM_RESTORE = WM_USER + $1000;
MYAPPNAME = 'My Delphi Program';

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
procedure CreateParams(var Params: TCreateParams);
override;
Procedure RestoreRequest(var message: TMessage);
message CM_RESTORE;
end;


var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.CreateParams(var Params: TCreateParams);
begin

inherited CreateParams(Params);
Params.WinClassName := 'My Delphi Program';
end;


procedure TForm1.RestoreRequest(var message: TMessage);
begin

if IsIconic(Application.Handle) = TRUE then

Application.Restore
else

Application.BringToFront;
//showmessage('have run');
end;


end.
 
program AAA;

uses
...

var
Mutex: THandle;

{$R *.res}

begin

Mutex := CreateMutex(nil, True, '程序名称');
if GetLastError <> ERROR_ALREADY_EXISTS then

begin

Application.Initialize;
Application.CreateForm(TfmMain, fmMain);
Application.Run;
end
else

MessageBox(0, '程序已经有一个实例在运行!', '警告', (MB_OK or MB_ICONWARNING));
ReleaseMutex(Mutex);
end.
 
Singleton模式
 
很简单啊!你在程序的初始化中,
添上找寻你自己程序窗体的句柄,找到后就不运行,没有就运行!
procedure TForm1.FormCreate(Sender: TObject);
var
FormHWND : Hwnd;
str : string;
begin

str := 'Form1';
FormHWND := FindWindow(nil,pchar(str));
if FormHWND > 0 then
Exit;
.
.
.
end;
 
我的意思是想让程序实现Winamp播放器的那种功能,就是说,打开文件后就会重新调用参数列表,重新播放新的参数对应的歌曲,而不是打开第二个实例
 
太复杂了,看不懂,
我的意思是想让程序实现Winamp播放器的那种功能,就是说,打开文件后就会重新调用参数列表,重新播放新的参数对应的歌曲,而不是打开第二个实例
 
我的意思是想让程序实现Winamp播放器的那种功能,就是说,打开文件后就会重新调用参数列表,重新播放新的参数对应的歌曲,而不是打开第二个实例
 
program Project1;

uses
Windows,
Messages,
Forms,
Unit1 in 'Unit1.pas' {Form1};

var
v_Hwnd:HWND;

{$R *.res}

begin

v_Hwnd:=FindWindow('TForm1',nil);
if v_Hwnd <> 0 then

begin

postmessage(v_Hwnd,WM_CLOSE,0,0);
end;

Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
 
后退
顶部