1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 隐藏窗口和任务栏图标的实现

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

时间:2021-11-26 20:26:12

相关推荐

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。