如何让运行中的应用程序从任务管理器中消失(hangwire发表于2001-10-17 0:05:13) [问题]
通常我们按下CTRL+ATL+DEL组合键后,可以看到正在运行的程序或者进程,有没有办法让程序从CTRL+ATL+DEL消失掉呢?也就是说让正在运行的程序对CTRL+ATL+DEL不可见。
[解答]
答案是肯定的,办法如下:
使用Win32 API 函数RegisterServiceProcess,但是这个API函数的文档你是很难找到的。这里我们要用一下汇编。#include <windows.h>HINSTANCE hLibrary;
void *regproc;void CADInit(void);
void HideApp(void);
void ShowApp(void);
void CADClean(void);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  CADInit(); //加载 DLL 并创建一指向它指针
  HideApp(); //隐藏程序
  //ShowApp(); //显示程序  //其他处理或调用
  
  CADClean(); //卸载 DLL
  return 0; //retrun 0 因为没有进入消息循环
}void CADInit(void)
{
  //加载 kernel32.dll
  hLibrary = LoadLibrary("kernel32.dll");
  //获取函数RegisterServiceProcess的地址
  regproc = GetProcAddress(hLibrary, "RegisterServiceProcess");
}void HideApp(void)
{
  //实现程序的隐藏
  __asm
  {
   push 1
   push 0
   call regproc
  }
  return;
}void ShowApp(void)
{
  //恢复状态
  __asm
  {
      push 0
      push 0
      call regproc
  }
  return;
}void CADClean(void)
{
  //卸载 DLL
  FreeLibrary(hLibrary);
  return;
}
本程序在W2K和Win9x测试通过。 

解决方案 »

  1.   

    直接regproc(0, 1);或regproc(0, 0);就是了,有必要用汇编吗?
      

  2.   

    to  DentistryDoctor(牙科医生) :学习中...在win2000下我怕麻烦,所以做成服务了
      

  3.   

    这个方法好像只适合WIN98啊。。
      

  4.   

    这个方法只适合win98
    更简单的方法:
    #ifndef RSP_SIMPLE_SERVICE //登记
    #define RSP_SIMPLE_SERVICE 1
    #endif
    #ifndef RSP_UNREGISTER_SERVICE //取消登记
    #define RSP_UNREGISTER_SERVICE 0
    #endiftypedef DWORD (WINAPI *fp_RegServProc)(DWORD dwProcessId,DWORD dwType);HMODULE hModule = ::GetModuleHandle(TEXT("kernel32.dll"));
    // punch F1 on "RegisterServiceProcess" for what it does and when to use it.
    fncptr=(fp_RegServProc)::GetProcAddress(hModule, "RegisterServiceProcess");
    if (fncptr!=NULL)
          (*fncptr)(0, RSP_SIMPLE_SERVICE);开机启动添加到注册表
    Software\\Microsoft\\Windows\\CurrentVersion\\RunServices
      

  5.   

    有几种方法呀
    hookapi拦截列举进城函数
    把程序写成windows服务程序等