网上也有这类小程序,用过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<HideTaskClass::m_HideString.GetSize();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<HideTaskClass::m_HideTaskTitle.GetSize();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<HideTaskClass::m_HideTaskTitle.GetSize();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的下载频道中。欢迎讨论