清除无效的托盘

清除无效的托盘


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 );

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值