首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Win9x 隱藏程式不出現在 Ctrl+Alt+Del 工作管理器中

     編輯:關於C++

方法一:清除主視窗標題

Windows 95/98 判斷是否在「關閉程式」對話框(Ctrl+Alt+Del)顯示應用程式,依據是主視窗是否有標題。若主視窗無標題,系統便不會列入清單。最佳清除時機在 WinMain 中:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try {
        Application->Title = "";  // 關鍵:設為空字串
        Application->Initialize();
        Application->CreateForm(__classid(TForm1), &Form1);
        Application->Run();
    }
    catch (Exception &exception) {
        Application->ShowException(&exception);
    }
    return 0;
}

方法二:註冊為服務型進程 RegisterServiceProcess

RegisterServiceProcess 是 Kernel32.dll 中未公開的函數,MS SDK 標頭檔無原型,但 Borland C++ Builder 的匯入庫有定義。其主要用途是建立服務模式進程,副作用是將程式從 Ctrl+Alt+Del 清單隱藏。

實作範例 (C++Builder)

標頭檔:

typedef DWORD (__stdcall *pRegFunction)(DWORD, DWORD);
class TForm1 : public TForm {
__published:
    TButton *Button1;
private:
    HINSTANCE hKernelLib;
    pRegFunction RegisterServiceProcess;
public:
    __fastcall TForm1(TComponent* Owner);
    __fastcall ~TForm1();
};

實作檔:

#include "Unit1.h"
#define RSP_SIMPLE_SERVICE  1
#define RSP_UNREGISTER_SERVICE 0

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    hKernelLib = LoadLibrary("kernel32.dll");
    if (hKernelLib) {
        RegisterServiceProcess = (pRegFunction)GetProcAddress(hKernelLib, "RegisterServiceProcess");
        if (RegisterServiceProcess)
            RegisterServiceProcess(GetCurrentProcessId(), RSP_SIMPLE_SERVICE);
    }
}

__fastcall TForm1::~TForm1()
{
    if (hKernelLib) {
        if (RegisterServiceProcess)
            RegisterServiceProcess(GetCurrentProcessId(), RSP_UNREGISTER_SERVICE);
        FreeLibrary(hKernelLib);
    }
}

常數說明: RSP_SIMPLE_SERVICE (1) 註冊為簡易服務,RSP_UNREGISTER_SERVICE (0) 註銷。

注意事項

  • 此函數僅存在於 Windows 95/98/Me,Windows NT/2000/XP 及後續版本不支援。
  • 屬於未文件化 API,微軟不保證未來版本相容性,生產環境謹慎使用。
  • 方法一(清除標題)相容性較好,但視窗標題列將不顯示文字。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved