制作一個不在任務欄及任務列表中顯示的幽靈程序

發表于:2007-07-14來源:作者:點擊數: 標簽:
網上已經有許多地方提到了如何將在任務欄隱藏應用程序,使用的方法都是將Application的屬性變為WS_EX_TOOLWINDOW。即在WinMain函數中加入如下代碼: DWORD dwExStyle = GetWindowLong(Application-Handle, GWL_EXSTYLE); dwExStyle |= WS_EX_TOOLWINDOW; SetW
網上已經有許多地方提到了如何將在任務欄隱藏應用程序,使用的方法都是將Application的屬性變為WS_EX_TOOLWINDOW。即在WinMain函數中加入如下代碼:

DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE);
dwExStyle |= 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函數查出來。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97