分类:
2008-10-13 16:10:31
起这个名字能吸引眼球,其实功能不只这些。
以下代码再XP下测试无误,适合做全屏显示的时候使用。
源码都在下面贴出来了,懒得做Test程序了,此代码只针对高级用户,自己有动手能力的,等demo的就不要继续向下看了。
欢迎指正 msn: x.brent@gmail.com
核心思想是。
0. 不做驱动也不做其他的高难度动作,跟windows绕几个小圈圈。
1. 启动任务管理器。WinExec(“taskmgr.exe”,SW_HIDE). 如果SW_SHOW将会无效
2. 枚举所有桌面的窗口,可能是任何一个程序的窗口,如果想过滤就FindWindow特殊处理,当然此处是一网打尽了。
3. 将所有可见的窗口(IsWindowVisable() ) 设置为禁用并且隐藏,当然还要恢复,所以此处做一个 std::vector的链表,储存起来以前的显示状态
4. 启动以后就将任务管理器也一并藏起来了,由于windows自带的任务管理器,不允许多个实例同时运行,所以跑一次ClearDesktop()函数就可以了,如果某些强人使用了,其他版本的任务管理器,
例如procexp 也有效,但是其他的没有经过测试的,又可以多个实例运行的,看官就自己举一反三了,定时器,除了属于自己HINSTANCE的,及时的办理其他程序。
5. CTRL+ALT+DELETE如果设置为调用任务管理器,而不是登录窗口,此处将没有反映。当然效果始终是任务管理器挂了。如果不禁止任务管理器,也只能在任务管理器中看到自己。方便用户及时的干掉。
6. 该退出程序了,退出的时候,做还原操作,藏起来了,要给显示出来,如果Disable了还要给人家再Enable。
7. 由于我们启动了任务管理器还要给他干掉。TerminateProcess(hClose,0);
8. 干掉以后任务栏托盘区还会留有尸体,然后再清除任务栏图标
9. 老大退出了,其他人可以出来凉快了。
#include
struct desktop
{
HWND hwndDesktop; // 窗口的句柄
BOOL bEnable; // 是Disable Or Enable
WINDOWPLACEMENT plm; // 窗口状态
};
std::vector
// 回调函数,枚举桌面的所有窗口
BOOL CALLBACK deskwindow_mgrProc(HWND hDesktop,LPARAM lParam)
{
// 不可见的就不要操作了
if( !::IsWindowVisible(hDesktop) )
return TRUE; // 如果不返回TRUE,就只枚举一个了
// 建立一个窗口对象,管它有没有父窗口,一概办了它。
desktop desk ={0};
GetWindowPlacement( hDesktop,&desk.plm);// 存起来,当自身退出的时候做还原用,如果不还原,人家只能重启动,太不地道了
// 保存窗口句柄
desk.hwndDesktop = hDesktop;
// 原来该Disable的或者Enable,还要给人家还原回去,其他的就不要考虑了,毕竟我只要它禁止,隐藏
desk.bEnable = IsWindowEnabled(hDesktop);
// 归队
m_DesktopWindows.push_back(desk);
// 给我藏起来并且上锁,爷爷,孙子一概办了它
ShowWindow(hDesktop,SW_HIDE);
EnableWindow(hDesktop,FALSE);
return TRUE;
}
void ClearDesktop()
{
m_DesktopWindows.clear();
// 启动任务管理器,以为以前没有呢,有的话,自己举一反三了。
// 一定要Hide,不然任务管理器还是会被呼出来的。
WinExec("taskmgr.exe",SW_HIDE);
// 枚举所有桌面窗口,只此一次,当然想定时处理的话,别把自己也一并办了。
EnumDesktopWindows(
GetThreadDesktop( GetCurrentThreadId() ),
deskwindow_mgr::deskwindow_mgrProc,
(LPARAM)0);
}
void doExit()
{
desktop *pDesk;
int nLen = m_DesktopWindows.size();
for(int i=0; i
// 逐个取出来
pDesk= &m_DesktopWindows[i];
// 无效窗口不处理
if( !IsWindow(pDesk->hwndDesktop))
continue;
// 还原,包含以前是Hide还是Show
SetWindowPlacement(pDesk->hwndDesktop,&pDesk->plm);
// 还原以前是Enable还是Disable
EnableWindow( pDesk->hwndDesktop,pDesk->bEnable );
}
// 干掉自己启动起来的任务管理器
CloseSpecific("taskmgr.exe");
// 清除链表
m_DesktopWindows.clear();
}
#include
// 干掉指定的进程名称,例如notepad.exe, taskmgr.exe , 如果同名的程序很多,while一下了。
void CloseSpecific(const char* name)
{
HANDLE hClose,handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 info;
info.dwSize=sizeof(PROCESSENTRY32);
if(::Process32First(handle,&info))
{
if( !strcmp(name,info.szExeFile))
goto myExit;
}
while(Process32Next(handle,&info)!=FALSE)
{
if( !strcmp(name,info.szExeFile))
goto myExit;
}
::CloseHandle(handle);
return;
myExit:
::CloseHandle(handle);
hClose=OpenProcess(PROCESS_ALL_ACCESS,TRUE,info.th32ProcessID);
if(hClose)
TerminateProcess(hClose,0);
}
// 这是VCKBASE上另别人的清除任务栏无效尸体图标的MFC代码,拿回去举一反三了。
// 清除无效的托盘图标 ( 谢红伟 2007-5-12 10:51:00 )
int clearShiTi( BOOL &bNullBeDel )
{
bNullBeDel = FALSE;
HWND hStatus=::FindWindow("Shell_TrayWnd",NULL);
if( !hStatus)
return -1;
HWND hNotify=FindWindowEx(hStatus,NULL,"TrayNotifyWnd",NULL);
if( !hNotify)
return -1;
HWND hNotify1=FindWindowEx(hNotify,NULL,"SysPager",NULL);
if(!hNotify)
return -1;
HWND hNotify1_0=FindWindowEx(hNotify1,NULL,"ToolBarWindow32",NULL);
if(!hNotify1_0)
return -1;
DWORD pid = 0;
GetWindowThreadProcessId(hNotify1_0,&pid);
if( !pid)
return -1;
::SendMessage(hNotify1_0,WM_PAINT ,NULL,NULL);
CRect rect;
::GetWindowRect(hNotify1_0,&rect);
::InvalidateRect(hNotify1_0,&rect,false);
int iNum=::SendMessage(hNotify1_0,TB_BUTTONCOUNT ,NULL,NULL);
HANDLE hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_ALL_ACCESS,true,pid);
if( !hProcess)
return -1;
unsigned long n = 0;
TBBUTTON *pButton = new TBBUTTON;
CString strInfo = _T("");
wchar_t name[256] = {0};
TBBUTTON BButton;
unsigned long whd,proid;
CString x;
for(int i=0; i
::SendMessage(hNotify1_0,TB_GETBUTTON,i,(LPARAM)(&BButton));
ReadProcessMemory(hProcess,&BButton,pButton,sizeof(TBBUTTON),&n);
if (pButton->iString != 0xffffffff)
{
try
{
ReadProcessMemory(hProcess,(void *)pButton->iString,name,255,&n);
}
catch(...)
{
}
strInfo.Format("%d : %s\n",i+1,CString(name));
TRACE(strInfo);
}
try
{
whd=0;
ReadProcessMemory(hProcess,(void *)pButton->dwData,&whd,4,&n);
}
catch(...)
{
}
proid=NULL;
GetWindowThreadProcessId((HWND)whd,&proid);
if(proid==NULL)
{
bNullBeDel = TRUE;
::SendMessage(hNotify1_0,TB_DELETEBUTTON,i,0);
}
}
delete pButton;
return 0;
}