怎样让用户使用用户管理器关不掉我的应用程序(100分)

  • 主题发起人 主题发起人 xman
  • 开始时间 开始时间
X

xman

Unregistered / Unconfirmed
GUEST, unregistred user!
要求如题,不知各位大侠有何解决办法。
我已试过调用API函数 systemparametersinfo,屏蔽ctrl+alt+del,但在启动
时只要适时的按ctrl+alt+del在我的程序被加载时就能在任务管理器中将它
关掉,有一个问题是如何提高ctrl+alt+del的优先级或者使自己的应用程序
不在任务管理器中出现。
 
NT下,你的应用程序不在任务管理器出现是不可能的……BO也不例外,参见以前讨论……
 
处理WM_QUERYENDSESSION消息

RegisterServiceProcess
 
我教你一个好方法: 在程序关闭或试图关闭的时候造成一个系统错误,
比如:

s:pointer;
begin
s:=stralloc(1);
strcopy(s, '12345');
dispose(s);
dispose(s);
end;

造成关闭的时候产生一个系统错误, 就可以了.
 
同意沈前卫,函数代码如下
Procedure HideAppInTask;//Ctrl+Alt+Del时候隐藏
begin
RegisterServiceProcess(GetCurrentProcessID, 1);
end;
Procedure ShowAppInTask
begin
RegisterServiceProcess(GetCurrentProcessID, 0);
end;
 
感谢各位的关注,可是小弟只是知其然,而不知其所以然,能不能麻烦nose为小弟
解释一下,不胜感激!
 
RegisterServiceProcess(GetCurrentProcessID, 1);
把当前的程序注册为服务程序。Windows(NT)中服务程序是在后台运行的,不会出现
在任务列表中!具体为什么这样,我想,问MS
 
To Nose:
不在任务管理器中出现??在进程里还是会出现的!用结束进程可以杀掉它……
要是在进程里也不出现怎么实现??
 
wjiachun
我知道的就这么多了!真不好意思
 
在进程查看里也不出现那你就做成sys.
设备驱动在进程查看里看不到 (不过在设备列表里又有了)
 
有一点想说明,我只要使程序在98下不出现在任务管理器中即可,另外,我
按nose得方法写了(在98/delphi3下),可编译通不过,不认识函数RegisterServiceProcess,且我在uses中已加入shellapi,还是不行。why
 
哈! 我突然想到一个很歪的主意:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
winexec(pchar(application.exename),sw_hide);
end;

这下关不掉了吧?嘿嘿. :-)
 
不过这样我自己也关不掉应用程序了,不过这个思路倒是很特别,
请继续关注!
另外RegisterServiceProcess函数在delphi中调用时要注意什么?
 
>>不过这样我自己也关不掉应用程序了,

你自己关掉程序之前把OnClose:=nil就可以乐.呵呵
 
这样写,不用uses什么东西.
const
RSP_SIMPLE_SERVICE = $00000001;
RSP_UNREGISTER_SERVICE = $00000000;
type
TRegisterServiceProcess = function (dwProcessID, dwType : DWORD) : DWORD; stdcall;

function RegisterAsService : boolean;
var
RSP : TRegisterServiceProcess;
hMod : THandle;
begin
Result := false;
hMod := LoadLibrary('KERNEL32.DLL');
if hMod=0 then exit;
@RSP := GetProcAddress(hMod, 'RegisterServiceProcess');
if @RSP=nil then exit;
try
if RSP(0, RSP_SIMPLE_SERVICE)=1 then
Result := true;
finally
FreeLibrary(hMod);
end;
end;

function UnRegisterAsService : boolean;
var
RSP : TRegisterServiceProcess;
hMod : THandle;
begin
Result := false;
hMod := LoadLibrary('KERNEL32.DLL');
if hMod=0 then exit;
@RSP := GetProcAddress(hMod, 'RegisterServiceProcess');
if @RSP=nil then exit;
try
if RSP(0, RSP_UNREGISTER_SERVICE)=1 then
Result := true;
finally
FreeLibrary(hMod);
end;
end;

NOTE: NT下无效.
 
>>不过这样我自己也关不掉应用程序了,
除了OnClose:=nil这个方法, 你还可以通过kill进程来关闭程序,呵呵.
 
非常感谢cAkk,也感谢各位的关注,由于分数太少,请cAkk另外拿分,
并还有个问题问cAkk,为什么有两个函数,我只用了RegisterAsService ,
那UnRegisterAsService 有什么用,另外,能不能在程序中适当加一些
注释,不胜感激!
 
UnRegisterAsService就是反注册嘛! 习习.

代码有什么地方看不懂吗?
LoadLibrary('KERNEL32.DLL');//动态调入动态连接库
....
//得到RegisterServiceProcess这个API函数的地址
@RSP := GetProcAddress(hMod, 'RegisterServiceProcess');
....
if RSP(0, RSP_SIMPLE_SERVICE)=1 then //执行该函数
....
FreeLibrary(hMod); //释放动态连接库
 
多人接受答案了。
 
后退
顶部