to sam1111(我倒):
从哪条消息里得到“发送此消息的图标ID”;
如何取得ID?

解决方案 »

  1.   

    那里的图标一般把单击,右击,双击作为自己特定的消息事件激发自己的notify,你可以试试捕获鼠标的事件病判断位置
      

  2.   

    ICON发的消息的wParam是ICON的ID,你可以这样取得:
    UINT nID = (UINT)wParam;
    lParam代的是具体的鼠标事件,如左键单击等
      

  3.   

    什么消息啊?
    WM_LBUTTONDOWN?
      

  4.   

    hehe,
    我试过了,但是没有成功。
      

  5.   

    to sam1111(我倒) :
    你至少还能试试,怎么试呀?
      

  6.   

    托盘区(就是任务栏右边那个区,里面有好多图标)是不是一个独立的窗口?
    当鼠标放在某个图标上时候,会有Tip提示显示,
    从这些方面考虑是不是有什么办法呢?
      

  7.   

    我用WH_CALLWNDPROC类型的全局Hook捕捉消息,然后判断CWPSTRUCT结构的lParam成员是不是鼠标消息,如果是的话,就可以得到收此消息的窗口句柄和发消息的图标ID了。可是结果总是假。我怀疑CWPSTRUCT结构和一般的Message结构不同,不过没有仔细研究,因为一直比较忙。
    至于图标的ToolTip是在NOTIFYICON结构中定义的。
      

  8.   

    我已经有一些眉目了!
    我目前能够将图标隐藏并恢复,但请大家帮个忙,谁有activeskin3.52或3.55的解密版本,要没有一点问题的!我马上就贴代码.
      

  9.   

    //头文件 TrayToolBar.h
    #if !defined(AFX_TRAYTOOLBAR_H__615A398F_767F_4A49_B968_C19E1254E9AD__INCLUDED_)
    #define AFX_TRAYTOOLBAR_H__615A398F_767F_4A49_B968_C19E1254E9AD__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // TrayToolBar.h : header file
    ///////////////////////////////////////////////////////////////////////////////
    // CTrayToolBar window
    //没办法,只好采用最傻的办法了.
    #define ICON_MAX 1024class CTrayToolBar : private CToolBarCtrl
    {
    // Construction
    public:
    CTrayToolBar();// Attributes
    public:// Operations
    public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CTrayToolBar)
    //}}AFX_VIRTUAL// Implementation
    public:
    int GetCount();
    void DeleteIcon(int index);
    void Refresh();
    void HideAll();
    void ShowIcon(int index,BOOL bShow );
    void ShowAll();
    HWND m_handle;
    virtual ~CTrayToolBar(); // Generated message map functions
    protected:
    //{{AFX_MSG(CTrayToolBar)
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_TRAYTOOLBAR_H__615A398F_767F_4A49_B968_C19E1254E9AD__INCLUDED_)
      

  10.   

    // cpp文件TrayToolBar.cpp 
    // TrayToolBar.cpp : implementation file
    //#include "stdafx.h"
    #include "hideQQ.h"
    #include "TrayToolBar.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CTrayToolBarCTrayToolBar::CTrayToolBar()
    {
    if(m_handle = ::FindWindow("Shell_TrayWnd",NULL)) if(m_handle = FindWindowEx(m_handle,NULL,"TrayNotifyWnd",NULL))
      if(m_handle = FindWindowEx(m_handle,NULL,"ToolbarWindow32",NULL))
    if(m_handle)
    this->Attach(m_handle);
    else
    m_handle = NULL;}CTrayToolBar::~CTrayToolBar()
    {
    this->Detach();
    }
    BEGIN_MESSAGE_MAP(CTrayToolBar, CToolBarCtrl)
    //{{AFX_MSG_MAP(CTrayToolBar)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CTrayToolBar message handlersvoid CTrayToolBar::ShowAll()
    {
    if(!m_handle) {AfxMessageBox("获取system tray失败!"); return;}    int i = 0;
    while(i < ICON_MAX )
    {
    this->ShowIcon(i,TRUE);
    i++;
    } Refresh();}void CTrayToolBar::ShowIcon(int index ,BOOL bShow)
    {
    if(!m_handle) {AfxMessageBox("获取system tray失败!"); return;}
    //本来这里可以通过index来获得 nID,但是虽然函数成功,但idCommand却是错误的
    /*
    TBBUTTON * ptbbtn= new TBBUTTON;
    this->SendMessage(TB_GETBUTTON,(WPARAM) index,(LPARAM) ptbbtn);
    */
    if(bShow)
         this->PostMessage(TB_HIDEBUTTON, index ,(LPARAM) MAKELONG(FALSE, 0));
    else
         this->PostMessage(TB_HIDEBUTTON, index ,(LPARAM) MAKELONG(TRUE, 0));
     //  delete ptbbtn;
    }void CTrayToolBar::HideAll()
    { if(!m_handle) {AfxMessageBox("获取system tray失败!"); return;}    int i = 0;
    while(i < ICON_MAX )
    {
    this->ShowIcon(i,FALSE);
    i++;
    } Refresh();}void CTrayToolBar::Refresh()
    { NOTIFYICONDATAW Icon;
    Icon.cbSize = sizeof( NOTIFYICONDATAW );
    Icon.hWnd = this->m_hWnd ;
    Icon.uID = 0;
    Icon.uFlags = NIF_MESSAGE | NIF_TIP;
    Icon.uCallbackMessage = WM_USER + 777;
    Icon.hIcon = NULL; Shell_NotifyIconW( NIM_ADD , &Icon );
    Shell_NotifyIconW( NIM_DELETE , &Icon );}void CTrayToolBar::DeleteIcon(int index)
    {
    if(!m_handle) {AfxMessageBox("获取system tray失败!"); return;} this->DeleteButton(index);
    Refresh();
    }
    int CTrayToolBar::GetCount()
    {
    if(!m_handle) {AfxMessageBox("获取system tray失败!"); return 0;}
    return this->GetButtonCount();
    }
      

  11.   

    http://realcyi.myetang.com/dah/hideqq.exe可以下载此例程 20kb
      

  12.   

    贴代码的时候缩进格式都丢失了!思路大体是,从CToolbarCtrl派生一个CTrayToolBar然后在其构造函数中attach住windows的systemtray上面的那个toolbarctrl因为它是一个普通的toolbar,所以可以对它进行一定的操作,如使某个按钮hide或删除某个按钮等由于时间仓促,我没法试验出一些数据,估计都存在了按钮的一些附加信息中,所以只作出来一部分功能.大家可以讨论一下index 到 nid的转换问题,我获得的总是错误的,不知道为什么.
      

  13.   

    hehe,原来如此,
    我怎么忘了。
      

  14.   

    呵呵,无意中想出来的,本来向subclass它的,不过后来发现这是不现实,我时间太有限通过今天的试验,我发现上网拨号的那个程序申请了5个图标来实现动画图标,而QQ它们则只是采用一个图标用NIM_MODIFY来换图标
      

  15.   

    大家可以讨论一下index 到 nid的转换问题,我获得的总是错误的,不知道为什么. 
    我本来想获取button的idcommand信息,这样就不用 从 0到ICON_MAX都发消息了,void CTrayToolBar::ShowIcon(int index ,BOOL bShow)
    {
    if(!m_handle) {AfxMessageBox("获取system tray失败!"); return;}
    //本来这里可以通过index来获得 nID,但是虽然函数成功,但idCommand却是错误的
    /*
    TBBUTTON * ptbbtn= new TBBUTTON;
    this->SendMessage(TB_GETBUTTON,(WPARAM) index,(LPARAM) ptbbtn);
    */
    if(bShow)
        this->PostMessage(TB_HIDEBUTTON, index ,(LPARAM) MAKELONG(FALSE, 0));
    else
        this->PostMessage(TB_HIDEBUTTON, index ,(LPARAM) MAKELONG(TRUE, 0));
    //  delete ptbbtn;
    }
      

  16.   

    http://www.csdn.net/expert/TopicView.asp?id=258523
      

  17.   

    gameboy999(我心迷茫) 的方法果然不错,我试过了HideAll()和ShowAll()都不错,我给分。
    如果谁能从鼠标的位置确定nid,再转换成为index,就更完美了。