woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

清除无效的托盘图标

int CDeleteTrayNullIconDlg::DeleteTrayNullIcon(BOOL &bNullBeDel)
{
    HWND  hNotify1;
    int iMethod=0;
    bNullBeDel = FALSE;
    HWND  hStatus=::FindWindow("Shell_TrayWnd",NULL);  //
得到任务栏句柄
    if  (hStatus==NULL) 
    { 
        //AfxMessageBox ( "Get Shell_TrayWnd error!" );
        return -1; 
    } 
    HWND  hNotify=FindWindowEx(hStatus,NULL,"TrayNotifyWnd",NULL); //
右下角区域
    if  (hNotify==NULL)
    { 
        //AfxMessageBox ( "Get TrayNotifyWnd error!" );
        return -1; 
    }
goto1:
    if (iMethod<1)
    {
        hNotify1=FindWindowEx(hNotify,NULL,"SysPager",NULL);
        if  (hNotify==NULL) 
        { 
            //AfxMessageBox ( "Get SysPager error!" );
            return -1; 
        }
        if (hNotify1==NULL)
        {
            hNotify1=hNotify;
        }
    }
    else
    {
        hNotify1=hNotify;
    }

    HWND  hNotify1_0=FindWindowEx(hNotify1,NULL,"ToolBarWindow32",NULL);//右下角区域(不包括时间)
    if  (hNotify1_0==NULL)  
    { 
        //AfxMessageBox ( "Get ToolBarWindow32 error!" );
        return -1; 
    } 
    //-------------------
以上是得到任务栏右下脚一块地方的句柄
    DWORD  pid = 0; 
    GetWindowThreadProcessId(hNotify1_0,&pid); 
    if  (pid==NULL) 
    { 
        //AfxMessageBox ( "Get pid error!" );
        return -1; 
    }  
   
    HANDLE  hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_ALL_ACCESS,true,pid); 
    if  (hProcess==NULL) 
    { 
        //AfxMessageBox ( "Get hd error!" );
        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);  //获取任务栏上图标个数
    if (iNum<1 && iMethod==0)
    {
        iMethod=2;
        goto goto1;
    }

    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<iNum; 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 ",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;
}

原作者谢红伟,上代码我作了几个地方修改与优化

#define  WM_NOTIFYICON WM_USER+5

void CDeleteTrayNullIconDlg::OnButton1()
{
BOOL bNullBeDel = FALSE;
do
{
  DeleteTrayNullIcon ( bNullBeDel );
} while ( bNullBeDel );

NOTIFYICONDATA ni;
ni.cbSize=sizeof(ni);
ni.hIcon=m_hIcon;
//ni.hWnd=m_pMainWnd->m_hWnd;
//strcpy(nd.szTip, "
我的托盘");
ni.uCallbackMessage=WM_NOTIFYICON;
ni.uFlags= NIF_ICON | NIF_MESSAGE | NIF_TIP ;
ni.uID=IDR_MAINFRAME;

Shell_NotifyIcon(NIM_ADD, &ni);
Shell_NotifyIcon(NIM_DELETE, &ni);
AfxMessageBox ( "
清除无效的托盘图标已经完成", MB_ICONINFORMATION );

}

posted on 2011-08-27 15:15 肥仔 阅读(603) 评论(0)  编辑 收藏 引用 所属分类: Windows开发


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理