关于Win2000里程序的问题,不大不小,可好像也不是很好解决。哪位富翁是否可以指点一下?(75分)

M

mynlxx

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序在Win2000下运行,我想处理下面的几个问题:
1。如何保证一台机只能运行一个我的程序。其他用户(本地用户,终端用户)只要其中一个
已经运行了,另一个则不能运行,如何判断?
2.是否可以用户退出后然后运行?及没用用户登录时自动运行?
 
使用Regedit查找
HKEY_LOCALMACHINE/Sodtware/Microsoft/Windows/CurrentVersion/Run,
你会发现所有的Windows启动时调用的程序都在这里,
于是你将你的程序增加在这里就可以了.名称为你的程序的标题,
其值为你的程序的执行路径和文件名称.
 
procedure TForm1.FormCreate(Sender: TObject);
var
ZAppName: array[0..127] of char;
Hold: String;
Found: HWND;
begin
Hold := Application.Title;
Application.Title := 'OnlyOne'
+ IntToStr(HInstance); // 暂时修改窗口标题
StrPCopy(ZAppName, Hold); // 原窗口标题
Found := FindWindow(nil, ZAppName); // 查找窗口
Application.Title := Hold; // 恢复窗口标题
if Found<>0 then begin
// 若找到则激活已运行的程序并结束自身

ShowWindow(Found, SW_RESTORE);
Application.Terminate;
end;
end;
 
唉。。。
2000下用Findwidow不行的啊。不同用户进去,只能找到本用户的。。别人运行了不知道的!
还有,在启动组里添加了不行的,没登录,或是退出来会自动退出!
 
1。如何保证一台机只能运行一个我的程序。
在注册表中写一个标志,程序运行前判断这个标志就行了。标志可以按日期生成。。。
 
我写的代码,看看吧
program ContentPRJ;

uses
Dialogs,
Windows,
Forms,
UnitContent in 'UnitContent.pas' {FormContent},
UnitConst in 'UnitConst.pas',
ConnectFunc in 'ConnectFunc.pas',
UnitCBMSConst in 'UnitCBMSConst.pas',
UnitDataModule in 'UnitDataModule.pas' {DataModule1: TDataModule},
UnitAddContent in 'UnitAddContent.pas' {FormAddContent},
UnitUpload in 'UnitUpload.pas' {FormUpload},
UnitLPARTITION in 'UnitLPARTITION.pas' {FormLPARTITION},
UnitMediaPlayer in 'UnitMediaPlayer.pas' {FormMediaPlayer},
UnitDATTOMPG in 'UnitDATTOMPG.pas' {FormDATTOMPG},
UnitBase in 'UnitBase.pas' {BaseForm},
UnitModifyContent in 'UnitModifyContent.pas' {FormModifyContent},
UnitBatchUpload in 'UnitBatchUpload.pas' {FormBatchUpload},
UnitDownload in 'UnitDownload.pas' {FormDownload},
UnitChangeName in 'UnitChangeName.pas' {FormChangeName},
CBNLoginAttest in 'CBNLoginAttest.pas',
UnitDataExchange in 'UnitDataExchange.pas' {FormDataExchange},
UnitLogin1 in 'UnitLogin1.pas' {FormLogin1},
XPBarMenu in 'XPBarMenu.pas',
XPMenu in 'XPMenu.pas',
UnitLogin in 'UnitLogin.pas' {FormLogin},
UnitAbout in 'UnitAbout.pas' {FormAbout};

{$R *.res}

var
hMutex : HWND;
Ret : Integer;

begin
Application.Initialize;
Application.Title := 'CSMS3.0 Program Manage Module' ;
hMutex:=CreateMutex(nil,False,'CSMS3.0 Program Manage Module');
Ret:=GetLastError;
If Ret<>ERROR_ALREADY_EXISTS Then
Begin
Application.CreateForm(TFormContent, FormContent);
Application.CreateForm(TDataModule1, DataModule1);
Application.CreateForm(TFormAddContent, FormAddContent);
Application.CreateForm(TFormUpload, FormUpload);
Application.CreateForm(TFormLPARTITION, FormLPARTITION);
Application.CreateForm(TFormMediaPlayer, FormMediaPlayer);
Application.CreateForm(TFormDATTOMPG, FormDATTOMPG);
Application.CreateForm(TBaseForm, BaseForm);
Application.CreateForm(TFormModifyContent, FormModifyContent);
Application.CreateForm(TFormBatchUpload, FormBatchUpload);
Application.CreateForm(TFormDownload, FormDownload);
Application.CreateForm(TFormChangeName, FormChangeName);
Application.CreateForm(TFormDataExchange, FormDataExchange);
Application.CreateForm(TFormLogin1, FormLogin1);
Application.CreateForm(TFormLogin, FormLogin);
Application.CreateForm(TFormAbout, FormAbout);
Application.Run;
end
else
MessageBox(application.handle,'程序已经启动,无需再次运行','提示',MB_ICONASTERISK or MB_OK);
ReleaseMutex(hMutex);
end.
 
To 老人家:
你的方法在不同用户下是不管用的。判断不出来。
To wumeng:
兄弟的方法不错。呵呵。

别的富翁不知是不是还有别的方法?
 
如何保证一台机只能运行一个我的程序:
使用互斥变量,主窗体运行时打开互斥变量OpenMutex若存在就终止程序,否则就创建互斥变量CreateMutex,
 
多人接受答案了。
 
顶部