Chinaunix首页 | 论坛 | 博客
  • 博客访问: 818716
  • 博文数量: 756
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 4980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:40
文章分类

全部博文(756)

文章存档

2011年(1)

2008年(755)

我的朋友

分类:

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 m_DesktopWindows; // 所有桌面窗口都保存起来,包含他的子窗口,例如其他调试工具。

//  回调函数,枚举桌面的所有窗口
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;
}

 


--------------------next---------------------

阅读(552) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~