隐藏窗口和任务栏图标的实现

     网上也有这类小程序,用过2个都觉得不够方便,所以就想着自己来实现一个。

     功能:响应快捷键或者按钮隐藏(显示)包含关键字的窗口和任务栏图标,可设定隐藏关键字、设定快捷键、程序最小化到托盘。

   

     主要包含以下几个模块:

1. 设置和响应快捷键  2.设置关键字,枚举运行的窗口并隐藏之  3.程序最小化到托盘。 下面分别介绍一下程序的实现

 

1. 响应快捷键,最小化到托盘情况下响应全局快捷键

     设置就不提了。

         a.   .h中添加

afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);

b.     消息映射添加:

ON_MESSAGE(WM_HOTKEY,OnHotKey)

c.      响应函数:

LRESULT CADA_HideTaskDlg::OnHotKey(WPARAM wParam,LPARAM lParam)

{

if(HideTaskClass::m_Hide == TRUE)

{

gShowTaskBar();

HideTaskClass::m_Hide = FALSE;

}

else

{

gHideTaskBar();

HideTaskClass::m_Hide = TRUE;

}

return TRUE;

}

 

2.  枚举并隐藏窗口

a. 枚举窗口

EnumWindows(ADA_EnumWindowsProc,NULL);

 

b. 在枚举窗口函数内取得窗口名进行处理

BOOL CALLBACK ADA_EnumWindowsProc(HWND hWnd, LPARAM lParam)

{

char * bTaskName;

int cTxtLen,i;

CString cTitle,strtmp;

 

//be sure the current window is visible

if(::GetWindowLong(hWnd,GWL_STYLE)& WS_VISIBLE)

{

//Get the task name

cTxtLen = ::GetWindowTextLength(hWnd);

bTaskName = (char *) VirtualAlloc((LPVOID) NULL,(DWORD) (cTxtLen + 1), MEM_COMMIT, PAGE_READWRITE);

::GetWindowText(hWnd,bTaskName, cTxtLen + 1);

cTitle = bTaskName;

cTitle.MakeUpper();

 

for(i=0;i

{

strtmp = HideTaskClass::m_HideString[i];

if(cTitle.Find(strtmp) >=0)

{

HideTaskClass::m_HideTaskTitle.Add(cTitle);

HideTaskClass::m_HideTaskCnt++;

}

}

 

}

return TRUE;

}

         

c.  隐藏找到匹配关键字的窗口

for(i=0;i

{                        

cTitle = HideTaskClass::m_HideTaskTitle[i];

CWnd* pWnd = CWnd::FindWindow(NULL, cTitle);

if( pWnd )

{

pWnd->ShowWindow(SW_HIDE);

HideTaskClass::m_Hide = TRUE;        

}

}

 

     d. 隐藏窗口

for(i=0;i

{                        

cTitle = HideTaskClass::m_HideTaskTitle[i];

CWnd* pWnd = CWnd::FindWindow(NULL, cTitle);

 

if( pWnd )

{

pWnd->ShowWindow(SW_HIDE);

 

HideTaskClass::m_Hide = TRUE;        

}

}

 

3. 最小化到托盘

 

原理就是窗口隐藏,然后在托盘创建一个图标

a. 最小化点击后调用函数

void CADA_HideTaskDlg::OnSysCommand(UINT nID, LPARAM lParam)下面加入:

if(nID==SC_MINIMIZE)              

SendToTray(); //最小化到托盘的函数  自定义

 

b. 加一个成员函数

void CADA_HideTaskDlg::SendToTray()

{

    NOTIFYICONDATA nid;                   //定义托盘图标信息

nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);    

nid.hWnd=this->m_hWnd;    

nid.uID=IDI_HT;                       // 图标名 

nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;    

nid.uCallbackMessage=WM_SHOWTASK;     //图标点击之后的自定义消息名称    

nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_HT));    

strcpy(nid.szTip,"HideTask");         //图标信息提示条    

Shell_NotifyIcon(NIM_ADD,&nid);       //在托盘区添加图标    

ShowWindow(SW_HIDE);                  //隐藏程序窗口

 

}

 

c. 设置message

#define WM_SHOWTASK (WM_USER +1)

 

-------以下是双击图标重新显示程序---------

 

d. 定义消息处理成员函数

afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam);

 

e.添加message map

ON_MESSAGE(WM_SHOWTASK,OnShowTask)

 

f.消息响应

LRESULT CADA_HideTaskDlg::OnShowTask(WPARAM wParam, LPARAM lParam)

{

    if(wParam!=IDI_HT)        

return 1;    

switch(lParam)    

{           

case WM_RBUTTONUP:                               //右键起来时弹出快捷菜单       

{               

LPPOINT lpoint=new tagPOINT;            

::GetCursorPos(lpoint);                //得到鼠标位置            

CMenu menu;            

menu.CreatePopupMenu();                //声明一个弹出式菜单            

//增加菜单项“关闭”,点击则发送消息WM_CLOSE给主窗口(已隐藏),将程序结束。            

menu.AppendMenu(MF_STRING,ID_APP_EXIT,"关闭程序");                                     

menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);    //确定弹出式菜单的位置         

HMENU hmenu=menu.Detach();                

menu.DestroyMenu();            

delete lpoint;        

}           

break;        

case WM_LBUTTONDBLCLK:                           //双击左键的处理        

{            

this->ShowWindow(SW_SHOW);                  

DeleteTray();       

}           

break;        

default:          

break;   

}    

return 0;

}

 

void CADA_HideTaskDlg::DeleteTray()

{

NOTIFYICONDATA nid;  

nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);  

nid.hWnd=this->m_hWnd;  

nid.uID=IDI_HT;  

nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;  

nid.uCallbackMessage=WM_SHOWTASK;                 //自定义的消息名称  

nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_HT));  

strcpy(nid.szTip,"HideTask");                       

Shell_NotifyIcon(NIM_DELETE,&nid);                //在托盘区删除图标

}

 

 

以上是实现隐藏窗口和任务栏图标的几个重要功能块。将会将可执行的exe文件放到CSDN的下载频道中。欢迎讨论

 

你可能感兴趣的:(/VC,C/)