我是要做系统托盘!

解决方案 »

  1.   

    #define UM_SYSTRAY   (WM_USER + 1)afx_msg LRESULT OnSysTrayMessage(WPARAM wParam, LPARAM lParam);NOTIFYICONDATA ntd;
    ....
    ntd.hWnd = 你程主窗口句柄;
    ntd.uFlags = NIF_MESSAGE;
    ntd.uCallbackMessage = UM_SYSTRAY;
    ....Shell_NotifyIcon(NIM_ADD, );
      

  2.   

    我不想使用mfc的东西,UM_SYSTRAY只需要定义就可以了吗?
    不会吧?
      

  3.   

    将NOTIFYICONDATA的uCallbackMessage成员设为你自定义的消息ID,然后在你的回调过程中处理这个消息即可,其中的lParam参数就是相应的鼠标或键盘消息,比如WM_MOUSEMOVE、WM_LBUTTONDOWN等。
      

  4.   

    UINT RegisterWindowMessage(    LPCTSTR lpString  // address of message string
       );
      

  5.   

    可以这样:
    #define WM_MYTRAY (WM_USER + 100) // 加多少你自定咯
    // ...
    NOTIFYICONDATA nid;
    // ...
    nid.uCallbackMessage = WM_MYTRAY;
      

  6.   


      消息映射、循环机制是Windows程序运行的基本方式。VC++ MFC 中有许多现成的消息句柄,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困难。在MFC ClassWizard中不允许添加用户自定义消息,所以我们必须在程序中添加相应代码,以便可以象处理其它消息一样处理自定义消息。通常的做法是采取以下步骤:  第一步:定义消息。  推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。#define WM_MY_MESSAGE (WM_USER+100)    第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。 LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) 

    // TODO: 处理用户自定义消息 
    ... 
    return 0; 
    }    第三步:在类头文件的AFX_MSG块中说明消息处理函数:class CMainFrame:public CMDIFrameWnd 

    ... 
    // 一般消息映射函数 
    protected: 
    // {{AFX_MSG(CMainFrame) 
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); 
    afx_msg void OnTimer(UINT nIDEvent); 
    afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); 
    //}}AFX_MSG 
    DECLARE_MESSAGE_MAP() 
    }   第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。 BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) 
    //{{AFX_MSG_MAP(CMainFrame) 
    ON_WM_CREATE() 
    ON_WM_TIMER() 
    ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage) 
    //}}AFX_MSG_MAP 
    END_MESSAGE_MAP()   如果用户需要一个定义整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage定义消息:static UINT WM_MY_MESSAGE=RegisterWindowMessage("User");   并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。  当需要使用自定义消息时,可以在相应类中的函数中调用函数PostMessage或SendMessage发送消息PoseMessage(WM_MY_MESSAGE,O,O); 如果向其他进程发送消息可通过如下方法发送消息:DWORD result;
    SendMessageTimeout(wnd->m_hWnd, // 目标窗口
    WM_MY_MESSAGE, // 消息
    0, // WPARAM
    0, // LPARAM
    SMTO_ABORTIFHUNG |
    SMTO_NORMAL,
    TIMEOUT_INTERVAL,
    &result);   以避免其它进程如果被阻塞而造成系统死等状态。  可是如果需要向其它类(如主框架、子窗口、视类、对话框、状态条、工具条或其他控件等)发送消息时,上述方法显得无能为力,而在编程过程中往往需要获取其它类中的某个识别信号,MFC框架给我们造成了种种限制,但是可以通过获取某个类的指针而向这个类发送消息,而自定义消息的各种动作则在这个类中定义,这样就可以自由自在的向其它类发送消息了。  下面举的例子叙述了向视类和框架类发送消息的方法:  在主框架类中向视类发送消息:  视类中定义消息:ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //定义消息映射
    视类定义消息处理函数:// 消息处理函数
    LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAM lParam)
    {
    // TODO: 处理用户自定义消息 
    ... 
    return 0;
    } //发送消息的测试函数
    void CMainFrame::OnTest()
    {
    CView * active = GetActiveView();//获取当前视类指针
    if(active != NULL)
    active->PostMessage(WM_MY_MESSAGE,0,0);
    }   在其它类中向视类发送消息://发送消息的测试函数
    void CMainFrame::OnTest()
    {
    CMDIFrameWnd *pFrame;
    CMDIChildWnd *pChild;
    CView *pView;
    //获取主窗口指针
    pFrame =(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
    // 获取子窗口指针
    pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
    //获取视类指针
    pView = pChild->GetActiveView();
    if(pView != NULL)
    pView->PostMessage(WM_MY_MESSAGE,0,0);//发送消息

      

  7.   


      在视类中向主框架发送消息:  首先在主框架中定义相关的消息,方法同上,然后在发送消息的函数中添加代码如下//发送消息的测试函数
    void CMessageView::OnTest()
    {
    CFrameWnd * active = GetActiveFrame();//获取当前主窗口框架指针
    if(active != this)
    active->PostMessage(WM_MY_MESSAGE,0,0);
    return 0;
    }   在其它类中向不同的类发送消息可依次方法类推,这样我们的程序就可以的不受限制向其它类和进程发送消息,而避免了种种意想不到的风险。
      

  8.   

    楼上难道不知道楼主不想要mfc的代码?
      

  9.   

    sdk的啊,sdk的啊:(
    老马
    你这样
    #define WM_MYTRAY (WM_USER + 100) // 加多少你自定咯
    // ...
    NOTIFYICONDATA nid;
    // ...
    nid.uCallbackMessage = WM_MYTRAY;
    消息自己就会发送?
    我就是这样做的,可是没有反应啊!
      

  10.   

    #define WM_MYTRAY  WM_USER+200
    主窗口回调函数中加入相应的消息处理函数即可!case WM_MYTRAY:     ntd.hWnd = 你程主窗口句柄;
         ntd.uFlags = NIF_MESSAGE;
         ntd.uCallbackMessage =WM_MYTRAY;
         break;