2024年4月29日发(作者:)

个人收集资料系列

Delphi精典技艺

1

问:如何让del+CTRL+ALT看不见程序运行?

答:为了让程序用ALT+DEL+CTRL看不见,在implementation后添加声明:

functionRegisterServiceProcess(dwProcessID,dwType:Integer):Integer;stdcall;external'';

再在上面的窗口Create事件加上一句:RegisterServiceProcess(GetCurrentProcessID,1);//隐藏

也可以使用下面的函数:

functionMy_SelfHide:Boolean;

type

TRegisterServiceProcess=function(dwProcessID,dwType:DWord):DWORD;stdcall;

var

hNdl:THandle;

RegisterServiceProcess:TRegisterServiceProcess;

begin

Result:=False;

ifWin32Platform<>VER_PLATFORM_WIN32_NTthen//不是NT

begin

hNdl:=LoadLibrary('');

RegisterServiceProcess:=GetProcAddress(hNdl,'RegisterServiceProcess');

RegisterServiceProcess(GetCurrentProcessID,1);

FreeLibrary(hNdl);

Result:=True;

end

else

Exit;

end;

问:自我拷贝法怎么样使用?

答:这种方法的原理是程序运行时先查看自己是不是在特定目录下,如果是就继续运行,如果不是就把自己拷贝到特定目录下,

然后运行新程序,再退出旧程序.

打开Delphi,新建一个工程,在窗口的Create事件中写代码:

eate(Sender:TObject);

varmyname:string;

begin

myname:=ExtractFilename(e);//获得文件名

e<>GetWindir+mynamethen//如果文件不是在WindowsSystem那么..

begin

copyfile(pchar(e),pchar(GetWindir+myname),False);{将自己拷贝到WindowsSystem下}

Winexec(pchar(GetWindir+myname),sw_hide);//运行WindowsSystem下的新文件

ate;//退出

end;

end;

其中GetWinDir是自定义函数,起功能是找出WindowsSystem的路径.

functionGetWinDir:String;

var

Buf:array[0..MAX_PATH]ofchar;

begin

GetSystemDirectory(Buf,MAX_PATH);

Result:=Buf;

ifResult[Length(Result)]<>''thenResult:=Result+'';

end;

问:如何避免同时运行多个相同程序?

答:为了避免同时运行多个程序的副本(节约系统资源也),程序一般会弄成每次只能运行一个.这又有几种方法.

一种方法是程序运行时先查找有没有相同的运行了,如果有,就立刻退出程序.

修改dpr项目文件,修改begin和end之间的代码如下:

begin

lize;

ifFindWindow('TForm1','Form1')=0thenbegin

//当没有找到Form1时执行下面代码

inForm:=False;//不显示主窗口

Form(TForm1,Form1);

;

end;

end.

另一种方法是启动时会先通过窗口名来确定是否已经在运行,如果是则关闭原先的再启动。“冰河”就是用这种方法的。

2