如何使程序不被Ctrl+Alt+Del强行关闭?或只屏蔽Ctrl+Alt+Del?

coolqiang 2000-05-31 08:36:00
我编的一类似网吧计费软件,Windows启动后运行,但是如果按Ctrl+Alt+Del可在任务列表中看到,可强行关闭,如何使程序不能被强行关闭?如果这样做不到,能不能只屏蔽Ctrl+Alt+Del(我知道以屏保方式能屏蔽Ctrl+Alt+Del,但它同时也屏蔽了Alt+Tab等)?
...全文
353 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
halfone 2000-05-31
  • 打赏
  • 举报
回复
快给我分.
halfone 2000-05-31
  • 打赏
  • 举报
回复
unit Unit1;

interface

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

type
TForm1 = class(TForm)
BtnShow: TButton;
BtnHide: TButton;
procedure BtnShowClick(Sender: TObject);
procedure BtnHideClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL';

implementation

{$R *.DFM}

procedure TForm1.BtnShowClick(Sender: TObject);
begin
RegisterServiceProcess(GetCurrentProcessID, 0);
end;

procedure TForm1.BtnHideClick(Sender: TObject);
begin
RegisterServiceProcess(GetCurrentProcessID, 1);
end;

end.
halfone 2000-05-31
  • 打赏
  • 举报
回复
好了:我写个简单程序发给你
halfone 2000-05-31
  • 打赏
  • 举报
回复
哦!刚才不是屏蔽Ctrl+Alt+Del,而是按Ctrl+Alt+Del在任务列表中看不到当前程序的。
halfone 2000-05-31
  • 打赏
  • 举报
回复
请问是在win9x中吗?
如是:
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL';
hide;
RegisterServiceProcess(GetCurrentProcessID, 1);
show;
RegisterServiceProcess(GetCurrentProcessID, 0);
如果成功给我加分哦!
coolqiang 2000-05-31
  • 打赏
  • 举报
回复
谢谢三位的帮助,我试了一下,回复如下:

halfone:
你的程序很简单,但第一行是否不对,我编译出错,请写详细些好嘛?
mrssl:
你的程序实际是使Windows以为处于屏保状态,这样可以屏
蔽trl+Alt+Del,但同时也屏蔽了Alt+Tab,不是我想要达到的目的!
radish:
你的程序好像是C++语法的,能否用Delphi的语法格式写一下,特别请说明一下
typedef DWORD (__stdcall *pRegFunction)(DWORD, DWORD);
这行应该放在什么地方!

我是初学者,给大家添麻烦了!

radish 2000-05-31
  • 打赏
  • 举报
回复
制作一个不在任务栏及任务列表中显示的幽灵程序

成都 谢慧强 EMAIL:xiehuiqiang@21cn.com

网上已经有许多地方提到了如何将在任务栏隐藏应用程序,使用的方法都是将Application的属性变为WS_EX_TOOLWINDOW。即在WinMain函数中加入如下代码:

DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE);
dwExStyle and = WS_EX_TOOLWINDOW;
SetWindowLong(Application->Handle, GWL_EXSTYLE, dwExStyle);
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->ShowMainForm = false;
ShowWindow(Application->Handle, SW_HIDE);
Application->Run();

这样做之后,应用程序就不会在任务栏显示了,但在WIN9X的任务列表中仍能看到。要想在任务列表也将自己的程序隐藏就要借用kernel32.DLL中的RegisterServiceProcess这个函数了。由于要从DLL加载函数,我们先在头文件中加入: typedef DWORD (__stdcall *pRegFunction)(DWORD, DWORD); 在主Form的类定义中加入两个私有属性:
HINSTANCE hKernelLib;

pRegFunction RegisterServiceProcess;

用于记录从DLL加入的函数信息。 然后在主Form的构造代码中加入如下代码:
hKernelLib = LoadLibrary("kernel32.dll");
if(hKernelLib)
{
RegisterServiceProcess =
(pRegFunction)GetProcAddress(hKernelLib,
"RegisterServiceProcess");
if(RegisterServiceProcess)
RegisterServiceProcess(GetCurrentProcessId(),RSP_SIMPLE_SERVICE);
}

这段代码主要是把当前进程变为一个系统服务,从而在任务列表中把程序隐藏起来,相应的在构析代码中加入
if(hKernelLib)
{
if(RegisterServiceProcess)
RegisterServiceProcess(GetCurrentProcessId(),
RSP_UNREGISTER_SERVICE);
FreeLibrary(hKernelLib);
}

这样处理之后,程序就不在任务列表中出现了,但仍可用EnumWindows函数查出来。
mrssl 2000-05-31
  • 打赏
  • 举报
回复
可以运用Windows API 函数SystemParametersInfo()
其申明如下:(具体参看Help)
BOOL SystemParametersInfo(
UINT uiAction, // system parameter to query or set
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // user profile update flag
);

加入如下代码
procedure TForm1.FormCreate(Sender: TObject);
var
Fpoint:integer;
begin
Fpoint :=0;
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,@Fpoint,0 );
end;

Good luck !
恭喜发财 !

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧