网上也有这类小程序,用过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的下载频道中。欢迎讨论