精华内容
下载资源
问答
  • VC++任务栏提示区图标的实现

    热门讨论 2009-09-01 10:26:45
    VC++任务栏提示区图标的实现 VC++任务栏提示区图标的实现 VC++任务栏提示区图标的实现
  • 我们可以使用直接引用WIN32 API函数的方法实现任务栏提示区图标。 1、定义一个NOTIFYICONDATA数据结构,初始化各数据项。其结构详见在线帮助。 2、使用WIN32 API函数Shell_NotifyIcon实现任务栏提示区图标。函数...

    一、一个简单的直接引用的方法:
    我们可以使用直接引用WIN32 API函数的方法实现任务栏提示区图标。
    1
    、定义一个NOTIFYICONDATA数据结构,初始化各数据项。其结构详见在线帮助。
    2
    、使用WIN32 API函数Shell_NotifyIcon实现任务栏提示区图标。函数原形如下:
    WINSHELLAPI BOOL WINAPI Shell_NotifyIcon
    DWORD dwMessage//消息类型
    PNOTIFYICONDATA pnid //
    指向NOTIFYICONDATA结构的指针
    );
    消息类型包括:NIM_ADD 增加图标到任务栏;
    NIM_DELETE
    从任务栏删除图标;
    NIM_MODIFY
    修改任务栏图标;
    二、一个更好的面对对象的方法:

    为了使使用更加方便、合理,更符合面对对象的处理方法,我们应当封装一个类
    CSystemIcon),由此类实现任务栏提示区图标。

    // SystemIcon.h : header file 
    // 
    #ifndef _INCLUDED_SYSTEMICON_H_ 
    #define _INCLUDED_SYSTEMICON_H_ 
    ///// 
    // CSystemIcon window 
    class CSystemIcon : public CObject 
    {
        // Construction/destruction 
    public: 
        CSystemIcon(); 
        CSystemIcon(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID); 
        virtual ~CSystemIcon(); 
        // Operations 
    public: 
        BOOL Enabled() { return m_bEnabled; } 
        BOOL Visible() { return !m_bHidden; } 
        //创建系统图标 
        Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID); 
        //关于提示文本 
        BOOL SetTooltipText(LPCTSTR pszTooltipText); 
        BOOL SetTooltipText(UINT nID); 
        CString GetTooltipText() const; 
        //关于图标 
        BOOL SetIcon(HICON hIcon); 
        BOOL SetIcon(LPCTSTR lpIconName); 
        BOOL SetIcon(UINT nIDResource); 
        BOOL SetStandardIcon(LPCTSTR lpIconName); 
        BOOL SetStandardIcon(UINT nIDResource); 
        HICON GetIcon() const; 
        void HideIcon(); 
        void ShowIcon(); 
        void DeleteIcon(); 
        //关于通知窗口 
        BOOL SetNotificationWnd(CWnd* pNotifyWnd); 
        CWnd* GetNotificationWnd() const; 
        //自定义消息处理函数 
        virtual LRESULT OnIconNotification(WPARAM uID, LPARAM lEvent); 
        // Overrides 
        // ClassWizard generated virtual function overrides 
        //{{AFX_VIRTUAL(CSystemIcon) 
        //}}AFX_VIRTUAL 
        // Implementation 
    protected: 
        BOOL m_bEnabled; //是否支持图标 
        BOOL m_bHidden; //是否隐藏图标 
        NOTIFYICONDATA m_tnd; //数据结构,请参考在线帮助 
        DECLARE_DYNAMIC(CSystemIcon) 
    }; 
    #endif 
    ///// 
    // SystemIcon.cpp : implementation file 
    #include "stdafx.h" 
    #include "SystemIcon.h" 
    #ifdef _DEBUG 
    #define new DEBUG_NEW 
    #undef THIS_FILE 
    static char THIS_FILE[] = __FILE__; 
    #endif 
    IMPLEMENT_DYNAMIC(CSystemIcon, CObject) 
    ///// 
    CSystemIcon::CSystemIcon()
    {
        
        memset(&m_tnd, 0, sizeof(m_tnd)); 
        m_bEnabled = FALSE; 
        m_bHidden = FALSE; 
    } 
    CSystemIcon::CSystemIcon(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, 
                             HICON icon, UINT uID) 
    {
        
        Create(pWnd, uCallbackMessage, szToolTip, icon, uID); 
        m_bHidden = FALSE; 
    }
    BOOL CSystemIcon::Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, 
                             HICON icon, UINT uID) 
    {
        
        //文件只能使用在WINDOW 95以上的版本中 
        VERIFY(m_bEnabled = ( GetVersion() & 0xff ) >= 4); 
        if (!m_bEnabled) return FALSE; 
        //确认通知窗口有效 
        VERIFY(m_bEnabled = (pWnd && ::IsWindow(pWnd->GetSafeHwnd()))); 
        if (!m_bEnabled) return FALSE; 
        //确认自定义消息大于WM_USER 
        ASSERT(uCallbackMessage >= WM_USER); 
        //确定提示文本长度小于64 
        ASSERT(_tcslen(szToolTip) <= 64); 
        //定义NOTIFYICONDATA结构的数据项 
        m_tnd.cbSize = sizeof(NOTIFYICONDATA); 
        m_tnd.hWnd = pWnd->GetSafeHwnd(); 
        m_tnd.uID = uID; 
        m_tnd.hIcon = icon; 
        m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
        m_tnd.uCallbackMessage = uCallbackMessage; 
        strcpy (m_tnd.szTip, szToolTip); 
        //设置图标 
        VERIFY(m_bEnabled = Shell_NotifyIcon(NIM_ADD, &m_tnd)); 
        return m_bEnabled; 
    }
    CSystemIcon::~CSystemIcon() 
    {
        DeleteIcon(); 
    }
    
    ///// 
    void CSystemIcon::DeleteIcon() 
    {
        
        
        if (!m_bEnabled) return; 
        m_tnd.uFlags = 0; 
        Shell_NotifyIcon(NIM_DELETE, &m_tnd); 
        m_bEnabled = FALSE; 
    }
    void CSystemIcon::HideIcon() 
    {
        
        
        if (m_bEnabled && !m_bHidden) 
        { 
            m_tnd.uFlags = NIF_ICON; 
            Shell_NotifyIcon (NIM_DELETE, &m_tnd); 
            m_bHidden = TRUE;
        }
    }
    void CSystemIcon::ShowIcon()
    {
        
        
        if (m_bEnabled && m_bHidden) 
        { 
            m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
            Shell_NotifyIcon(NIM_ADD, &m_tnd); 
            m_bHidden = FALSE; 
        }
    }
    BOOL CSystemIcon::SetIcon(HICON hIcon) 
    {
        
        
        if (!m_bEnabled) return FALSE; 
        m_tnd.uFlags = NIF_ICON; 
        m_tnd.hIcon = hIcon; 
        return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
    }
    BOOL CSystemIcon::SetIcon(LPCTSTR lpszIconName) 
    {
        
        
        HICON hIcon = AfxGetApp()->LoadIcon(lpszIconName); 
        return SetIcon(hIcon); 
    }
    BOOL CSystemIcon::SetIcon(UINT nIDResource) 
    {
        
        
        HICON hIcon = AfxGetApp()->LoadIcon(nIDResource); 
        return SetIcon(hIcon); 
    }
    BOOL CSystemIcon::SetStandardIcon(LPCTSTR lpIconName) 
    {
        
        
        HICON hIcon = LoadIcon(NULL, lpIconName); 
        return SetIcon(hIcon); 
    }
    BOOL CSystemIcon::SetStandardIcon(UINT nIDResource) 
    {
        
        
        HICON hIcon = LoadIcon(NULL, MAKEINTRESOURCE(nIDResource)); 
        return SetIcon(hIcon); 
    }
    HICON CSystemIcon::GetIcon() const 
    {
        
        
        HICON hIcon = NULL; 
        if (m_bEnabled) 
            hIcon = m_tnd.hIcon; 
        return hIcon; 
    }
    BOOL CSystemIcon::SetTooltipText(LPCTSTR pszTip) 
    {
        
        
        if (!m_bEnabled) return FALSE; 
        m_tnd.uFlags = NIF_TIP; 
        _tcscpy(m_tnd.szTip, pszTip); 
        return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
    }
    BOOL CSystemIcon::SetTooltipText(UINT nID) 
    {
        
        
        CString strText; 
        VERIFY(strText.LoadString(nID)); 
        return SetTooltipText(strText); 
    }
    CString CSystemIcon::GetTooltipText() const 
    {
        CString strText; 
        if (m_bEnabled) 
            strText = m_tnd.szTip; 
        return strText; 
    }
    
    BOOL CSystemIcon::SetNotificationWnd(CWnd* pWnd) 
    {
        
        
        if (!m_bEnabled) return FALSE; 
        ASSERT(pWnd && ::IsWindow(pWnd->GetSafeHwnd())); 
        m_tnd.hWnd = pWnd->GetSafeHwnd(); 
        m_tnd.uFlags = 0; 
        return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
    }
    CWnd* CSystemIcon::GetNotificationWnd() const 
    {
        
        
        return CWnd::FromHandle(m_tnd.hWnd); 
    }
    
    LRESULT CSystemIcon::OnIconNotification(WPARAM wParam, LPARAM lParam) 
    {
        
        
        if (wParam != m_tnd.uID) 
            return 0L; 
        CMenu menu, *pSubMenu; 
        //单击右键弹出菜单 
        if (LOWORD(lParam) == WM_RBUTTONUP) 
        {
            if (!menu.LoadMenu(m_tnd.uID)) return 0; 
            if (!(pSubMenu = menu.GetSubMenu(0))) return 0; 
            //设定第一项为缺省 
            ::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE); 
            //定义弹出菜单 
            CPoint pos; 
            GetCursorPos(&pos); 
            ::SetForegroundWindow(m_tnd.hWnd); 
            ::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0, m_tnd.hWnd, NULL); 
            ::PostMessage(m_tnd.hWnd, WM_NULL, 0, 0); 
            menu.DestroyMenu(); 
        }
        else if (LOWORD(lParam) == WM_LBUTTONDBLCLK) 
        {
            if (!menu.LoadMenu(m_tnd.uID)) return 0; 
            if (!(pSubMenu = menu.GetSubMenu(0))) return 0; 
            //双击左键起动缺省菜单 
            ::SetForegroundWindow(m_tnd.hWnd); 
            ::SendMessage(m_tnd.hWnd, WM_COMMAND, pSubMenu->GetMenuItemID(0), 0); 
            menu.DestroyMenu(); 
                
        }
        return 1; 
    }

    三、一个简单的例子
    1
    、使用MFC AppWizard(EXE)创建项目文件。
    2
    、用Add to Project添加CSystemIcon类的.h文件与.CPP文件到工程中。
    3
    、在CFrameWnd类中添加下列语句:
    //
    自定义消息
    #define WM_ICON_NOTIFY WM_USER+10
    //
    定义成员变量
    #include "SystemIcon.h"
    CSystemIcon m_systemIcon
    4
    、定义消息映象与消息处理函数
    a
    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ...
    ON_MESSAGE(WM_ICON_NOTIFY, OnIconNotification)
    END_MESSAGE_MAP()
    b
    LRESULT CMainFrame::OnIconNotification(WPARAM wParam, LPARAM lParam)
    return m_systemIcon.OnIconNotification(wParam, lParam);
    c
    、定义LRESULT OnIconNotification(WPARAM wParam, LPARAM lParam)
    5
    、创建系统图标(在OnCreate中加添加):
    HICON hIcon=AfxGetApp()->LoadIcon(IDI_MAINFRAME);
    if (!m_systemIcon.Create(this, //
    消息通知窗口
    WM_ICON_NOTIFY,//
    自定义消息
    "MY SAMPLE", //
    提示字符串
    hIcon, //
    图标ID
    IDR_POPUP_MENU //
    弹出菜单ID
    ))
    return -1;
    6
    、打开资源,创建弹出菜单(IDR_POPUP_MENU),CAPTION(_POPUP_):
    菜单项包括:a、关于(ID_APP_ABOUT) b、例子(ID_APP_APP) c、退出(ID_APP_EXIT)
    ClassWizard定义(ID_APP_APP)消息处理函数,添加:AfxGetMainWnd()->ShowWindow(SW_SHOW);
    7
    、打开资源,创建图标(IDI_ICON1)。
    8
    、删除应用类中的函数InitInstance中的pMainFrame->ShowWindow(m_nCmdShow)语句。
    9
    、编译执行形成执行文件。
    四、实现图标闪烁(利用定时器)

    void OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    switch(nIDEvent)
    {
    case 1:
    m_systemIcon.SetIcon(IDI_ICON1);
    Sleep(300);
    SetTimer(2,300,NULL);
    case 2:
    m_systemIcon.SetIcon(IDR_MAINFRAME);
    SetTimer(1,300,NULL);
    }
    CDialog::OnTimer(nIDEvent);
    }

     

     

     


     

    转载于:https://www.cnblogs.com/renhang888/archive/2012/06/24/2559650.html

    展开全文
  • visual C++ vc任务栏托盘图标的实现 只要ID叫ID_APP_EXIT就不用写代码也会结束程序
  • 目前,许多应用软件都实现了WINDOW任务栏提示区图标,如金山词霸、超级解霸等,这不仅增强了软件的特色,更方便了用户的使用。本文将介绍一个封装好的类,用VC++来实现这项功能,希望对读者有所帮助。
  • 用vb6 对Windows 95 任务栏提示区进行编程
  • 如何在任务栏提示区(右下角时钟旁边)显示一个小图标? 应用程序可以在任务栏提示区(右下角时钟旁边)显示一个小图标,叫做NotifyIcon。使用组建NotifyIcon可以实现这一功能。 属性、方法和事件都很简单。无需详细...

    如何在任务栏提示区(右下角时钟旁边)显示一个小图标?


    应用程序可以在任务栏提示区(右下角时钟旁边)显示一个小图标,叫做NotifyIcon。使用组建NotifyIcon可以实现这一功能。


    属性、方法和事件都很简单。无需详细介绍。如有需要在网上搜索一下。

     
    展开全文
  • 1在windows任务栏系统托盘显示图标 2捕获鼠标移动到托盘图标上的消息显示气泡提示,更换任务栏图标.zip
  • windows任务栏程序开发

    2010-03-17 14:00:00
    一. 引言 任务栏是中一个众所周知的概念,它指的是Windows桌面上显示已运行程序的一块条状区域。电脑知识网it.qc99.com一般来说,任务...所谓的任务栏编程主要指对任务栏提示区进行编程。Windows系统允许用户在任务栏

    一. 引言

      任务栏是中一个众所周知的概念,它指的是Windows桌面上显示已运行程序的 一块条状区域。

    电脑知识网 it.qc99.com

    一 般来说,任务栏是由三个部分组成的:最左边是“开始”按钮,中间是已运行程序的显示区域(Windows98还有一个快捷工具栏),最右边是任务栏提示区 域。所谓的任务栏编程主要指对任务栏提示区进行编程。Windows系统允许用户在任务栏提示区里放置自己的应用程序图标并定制自己需要的操作。

       在任务栏提示区里放置应用程序图标一方面方便了用户与应用程序的交流,另一方面也可使应用程序以更形象的形式给用户以提示。一般地,将应用程序图标放置 在任务栏提示区中意味着该应用程序是一个后台程序。例如在Windows中进行后台打印时,一个打印机图标就会显示在任务栏提示区中提示用户打印机进程正 在后台运行。目前有许多软件都使用了任务栏编程技术,如Netants、Go!zilla、金山词霸等,这一方面是由于这些软件具有某些“后台”性质,另 一方面也是因为将应用程序图标放在任务栏提示区中使得人机交互更为简便。

      目前有许多编程语言都可以针对任务栏进行编程,如V、、VB 等,也已有一些文章对其进行了介绍。但笔者发现很少有文章从原理到程序实现系统地对任务栏编程进行论述,大多数的资料只是给出几个API函数声明和一段代 码。但任务栏编程不仅涉及到API,还涉及回调函数等一些更为复杂的问题,因此有必要深入系统地对该问题进行探讨。


      二. 任务栏编程的实现技术

      Windows任务栏编程的基本思路是:(1)通过API函数调用在应用程序启动时将应用 程序图标放入任务栏提示区,在程序运行时修改图标特性,并在应用程序关闭时将图标从任务栏中删去;(2)通过使用回调函数控制应用程序。本节主要探讨通过 API来控制图标的一些问题。下一节将主要探讨回调函数。

      1. Shell_NotifyIcon函数

      其声明 为: Private Declare Function Shell_NotifyIconLib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long,pnid As NOTIFYICONDATA) As Long

      该函数给系统发送添加、修改、删除任务栏提示区图标的消息,系统根据发送的消息进行相应的处理。可以说该函数是任务栏提示区 编程的核心,掌握它就可以轻松地编写出符合要求的程序来。该函数中的参数意义如下:

      (1) 参数dwMessage (ByVal dwMessage As Long)

      该参数通知系统进行何种操作,取值如下:
    NIM_ADD
    添加图标到任务栏提示 区
    NIM_DELETE
    删除图标
    NIM_MODIFY
    发送图标特性已改变的消息

      (2) 参数pnid (pnid As NOTIFYICONDATA)

      图标特性数据,NOTIFYICONDATA定义如下:
    Private Type NOTIFYICONDATA
    CbSize As Long '该的大小
    hWnd As Long '处理图标通知消息的窗口句柄
    uID As Long '应用程序自定义的图标ID
    uFlags As Long '用来设置uCallbackMessage、hIcon、szTip等三个栏目是否有效,一般取组合NIF_ICON Or NIF_TIP Or NIF_MESSAGE,表示全部有效
    uCallbackMessage As Long '消息编号,将来当使用者在图标上按下鼠标时就会以消息通知消息处理回调函数
    hIcon As Long '图标句柄
    szTip As String*64 '提示消息
    End Type

      2.加入图标

      在启动窗体的Form_Load()事件 中加入以下代码就可以在程序运行时在任务栏提示区中添加一个图标:

    Dim nid As NOTIFYICONDATA
    nid.cbSize = Len(nid)
    nid.hwnd = Me.hwnd
    nid.uID = 9998
    nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
    nid.hIcon = Me.Icon
    nid.uCallbackMessage = WM_USER+100
    nid.szTip ="欢迎使用任务栏"
    Shell_NotifyIcon NIM_ADD, nid ' 

      3.删除图标

      在Form_Unload()事件中添加以下代码在程序关闭时删除图标,要注意的是这里所使 用到的uID和hWnd必须和当初加入图标时所使用的uID和hWnd完全一致。

    Dim nid As NOTIFYICONDATA
    nid.cbSize = Len(nid)
    nid.hwnd = Me.hwnd
    nid.uID = 9998
    Shell_NotifyIcon NIM_DELETE, nid

      4.修改图标

      下面一段代码实现图标的修改。这里的uId和hWnd也必须和当初 加入图标时所使用的 uId和hWnd完全一致。同时还必须正确设置uFlags和hIcon。uFlags必须设置为NIF_ICON,表示修改对图标有效;hIcon应设 为新图标。

    Dim nid As NOTIFYICONDATA
    nid.cbSize = Len(nid)
    nid.hWnd = Me.hWnd
    nid.uID = 9999
    nid.uFlags = NIF_ICON
    nid.hIcon = Image1.Picture
    Shell_NotifyIcon NIM_MODIFY, nid

      修改提示消息和消息编号的 方法与此类似。不同点是当修改提示消息时须将uFlags设为NIF_TIP,修改消息编号时须将uFlags设为NIF_MESSAGE。

       三. 回调函数

      在前面已经讲到,当用户在图标上按下鼠标时,系统将接收并传递消息给窗口消息处 理回调函数进行具体的处理。用户可以在回调函数中对不同的消息进行不同的程序处理来定制自己的应用程序的功能(例如鼠标左击时弹出一个菜单,鼠标右击时弹 出另一个菜单,鼠标双击时显示主窗口等等)。在任务栏提示区中加入图标时设置的消息编号uMessage就是用来告诉回调函数此消息来自图标对应的程序, 回调函数即可据此进行处理。回调函数是个比较复杂的问题,下面从VB程序的运行机制入手来具体阐述任务栏编程中回调函数的实现方法。

       1. VB应用程序的运行机制

      VB应用程序的运行是基于Windows的消息传递机制的。Windows的工作方式是一种多任务多线 程的工作方式,VB程序运行时是受Windows控制的。具体讲,一个VB程序运行时Windows的进程管理模块就会给它创建一个进程。进程与 Windows之间的通讯是通过消息传递来实现的:进程发送一个消息给Windows并等待,Windows处理完此消息后将结果会传给进程。由于 Windows支持多线程,因此一个进程可以在内部创建多个线程,这些线程共享此进程的地址空间、全局变量、文件以及各种信号。除了共享地址空间外,各个 线程是独立的,每个线程有自己的程序计数器、堆栈、寄存器及状态(等待、就绪、运行)。VB程序在运行时,通过对其所含的每个控件都创建一个线程来并行地 处理控件的事件。一个控件在进程内对应一个线程。这些线程也同样通过消息与Windows进行通讯。Windows为运行于其上的应用程序提供了确省的消 息处理程序。例如在一个VB程序运行时,右击一个文本框就会弹出一个包含“剪切”、“复制”、“粘贴”等功能的快捷菜单,这就是由Windows的确省消 息处理程序来完成的。Windows系统允许用户截获应用程序窗口的消息并用自定义的过程来加以处理。这个自定义的过程称为“回调”函数,用户可在回调函 数中对感兴趣的消息进行适当的处理,并将其它的消息交给系统原来的消息处理过程处理。这种“替代”似乎很困难,但实际上却是完全可以实现的。

       2. 用回调函数来处理任务栏提示区的消息

      回调函数(Callback Function)是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函 数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的 崩溃。

      通常情况下,回调函数采用Windows API的调用方式,即_stdcall,当然,DLL编制者可以自已定义调用方式,但客户程序也必须遵守相同的规定。在_stdcall方式下,函数的参 数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。

      将应用程序图 标放入任务栏提示区后,如果用户要想打开该应用程序窗口,必须到任务栏提示区中去点击图标。但这并不意味着用户点击后,窗口就会自动显示出来。每当用户点 击图标,系统会以消息方式通知窗口的消息处理回调函数,所以只要在应用程序窗口的回调函数中进行适当的编程就可以实现。

      窗口消息回调 函数的格式如下所示:
    Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

      因为回调函数是自定义的 函数,因此函数名和参数名都可以自定义。各参数的含义如下表所示:
    hWnd
    窗口句柄
    Msg
    等于当初调用 Shell_NotifyIcon时所设置的uCallbackMessage的值
    wParam
    等于当初调用 Shell_NotifyIcon时所设置的uID的值
    lParam
    等于鼠标消息,例如WM_LBUTTONDOWN(按下鼠标左键)等

       在VB使用回调函数存在不少限制:

      1、回调函数必须放到标准的模块(Module)中,而不能放在类模块或窗体代码中;
       2、AddressOf运算符只能用于自定义的过程、函数或属性,不能将其用于Declare语句声明的外部函数,也不能用于类型库中的函数;
       3、写在AddressOf后面的过程、函数和属性必须与有关的声明和过程在同一个工程中;
      4、由于回调函数要与系统直接交互,所以调试十 分困难,如果回调函数中有错误,可能会引起非法操作,致使VB运行环境崩溃。

      在VB中用回调函数处理任务栏提示区消息的具体步骤如 下:

      (1)在启动窗体的Form_Load()事件中加入以下代码。

    prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) '获取系统确省的窗口消息处理函数句柄
    SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProc '指定WndProc为新的消息处理函数
    '加入图标
    Dim nid As NOTIFYICONDATA
    nid.cbSize = Len(nid)
    nid.hwnd = Me.hwnd
    nid.uID = 9998
    nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
    nid.hIcon = Me.Icon
    nid.uCallbackMessage = WM_USER + 100 '定义消息编号
    Shell_NotifyIcon NIM_ADD, nid ' 

      (2)在模块中加入回调函数WndProc的代码

    Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_USER + 100 Then ''该消息等于调用Shell_NotifyIcon时定义的uCallbackMessage
    If lParam = WM_LBUTTONDOWN Or lParam = WM_RBUTTONDOWN Then
    '当按下鼠标左键或右键时弹出菜单
    frmCaution.PopupMenu frmCaution.mnuaa
    End If
    End If
    '其它的消息交给系统处理,prevWndProc为原来的窗口消 息处理函数的句柄
    WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
    End Function

      执行以上的代码时,API函数GetWindowLong()、 SetWindowLong()和CallWindowProc()的声明需要先加入到模块中,这些声明可通过VB所带的“API文本浏览器”获得。

       四. 实例分析:一个定时音乐提醒程序

      对于一个从事计算机工作的人来说,长时间坐在计算机前面 工作是常有的事。持续的屏幕注视往往使得眼睛十分疲劳。最好是能每隔一段时间休息一下。但计算机工作尤其是编程往往会使人全神贯注,忘记了时间。我们可以 设计一个定时音乐提醒程序,让它每隔一段时间就自动提醒自己休息一会儿。

      下面就结合前述的任务栏编程思想给出具体的程序实现。该程序 具有每隔一段时间就播放一段音乐提醒和到某个特定时刻播放音乐提醒的功能,并可以由用户自定义提醒时间、提醒内容以及音效。

      1、新建 一个工程,并加入五个窗体,分别命名为frmCaution、frmTipMess、frmSound、frmChangTime和frmAbout 。其中frmcaution为显示提醒消息的启动窗体,frmtipmess为用户自定义提醒内容的窗体,frmsound为用户自定义提醒声音的窗 体,frmchangtime为用户自定义提醒时间方式的窗体,frmabout为“关于”信息显示窗体。
     
      2、在 frmcaution上加入一个菜单“mnuaa”,在“mnuaa”下加入菜单“设置提醒时间……”、“设置提醒消息……”、“音效……”、“关 于……”、“退出”。菜单“mnuaa”就作为当单击图标时的弹出菜单。在frmcaution中加入一个panel,命名为“pnlmessage”, 用于显示消息。在frmcaution中加入一个多媒体控件,命名为“mm”,用于播放音乐。在frmcaution中加入一个时间控件“Time1”。

       3、在工程中加入一个标准模块mdlCommon,并在其中放置如下代码:

    'API函数声明
    Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

    Public prevWndProc As Long '原有的窗口消息处理函数
    Public Message As String '消息内容
    Public TipInterval As Integer '提示时间间隔
    Public TipTime As String '提示时间
    Public Time As Integer '累计时间

    Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_USER + 100 Then
    If lParam = WM_LBUTTONDOWN Or lParam = WM_RBUTTONDOWN Then
    '当按下鼠标左键或右键时弹出菜单
    frmCaution.PopupMenu frmCaution.mnuaa
    End If
    End If
    '其它的消息交给系统处理,prevWndProc为原来的窗口消息 处理函数的句柄
    WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
    End Function
    以上程序限于篇幅略去了数据结构和常量的定义。该定义可从“API文本浏览器”中获得。

       4、编写frmcaution的Form_Load()过程。

    Private Sub Form_Load()
    Load frmSound
    prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) '获取系统确省的窗口消息处理函数句柄
    SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProc '指定WndProc为新的消息处理函数
    '加入图标
    Dim nid As NOTIFYICONDATA
    nid.cbSize = Len(nid)
    nid.hwnd = Me.hwnd
    nid.uID = 9998
    nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
    nid.hIcon = Me.Icon
    nid.uCallbackMessage = WM_USER + 100 '定义消息编号
    Shell_NotifyIcon NIM_ADD, nid
    '设置显示界面
    pnlMessage.Left = (Me.ScaleWidth - pnlMessage.Width) / 2
    pnlMessage.Top = (Me.ScaleHeight - pnlMessage.Height) / 2
    TipInterval = 30 '提醒时间间隔默认为30分钟
    TipTime = "" '提醒时间默认为空
    Time = 0
    Message = "亲爱的主人,建议您先休息5分钟!"
    mm.Filename = frmSound!filSound.List(0)
    End Sub

       5、编写frmcaution的Form_Unload()过程。

    Private Sub Form_Unload(Cancel As Integer)
    Dim nid As NOTIFYICONDATA
    '恢复原来的窗口消息处理函数
    SetWindowLong Me.hwnd, GWL_WNDPROC, prevWndProc
    '删除图标
    nid.cbSize = Len(nid)
    nid.hwnd = Me.hwnd
    nid.uID = uID
    Shell_NotifyIcon NIM_DELETE, nid
    mm.Command = "close"
    End Sub
    6、编写Timer1_Timer()过程。
    Private Sub Timer1_Timer()
    If TipInterval <> 0 Then '若设置了提醒间隔
    Time = Time + 1 '累计时间加1秒
    If Time >= TipInterval * 60 Then '提醒时间间隔已到
    pnlMessage.Caption = Message
    Timer1.Enabled = False
    mm.Filename = mm.Filename
    mm.Command = "open"
    mm.Command = "play"
    Time = 0
    frmCaution.Show
    '窗口总显 示在最前
    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
    End If
    End If
    If TipTime <> "" Then '若设置了定时
    Dim NowTime As Date
    Dim DestTime As Date
    NowTime = Format(Now(), "hh:nn:ss")
    DestTime = Format(TipTime, "hh:nn:ss")
    If NowTime = DestTime Then '定时时间已到
    pnlMessage.Caption = Message
    Timer1.Enabled = False
    mm.Filename = mm.Filename
    mm.Command = "open"
    mm.Command = "play"
    frmCaution.Show
    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
    End If
    End If
    End Sub

       以上就给出了定时音乐提醒程序的大致过程。该程序运行时,确省情况下每隔30分钟就会跳出一个提醒窗口,同时播放一段音乐。当用户单击任务栏提示区中的 图标就会弹出一个菜单,然后用户可以选择需要执行的功能。该程序的一些其它功能如“设置提醒时间形式”、“设置音效”等因与本文主题没多少联系在此不再细 述。
    定时音乐提醒程序在 6.0中文企业版、Windows98环境下调试通过。读者若需要完整的源程序请E-mail 与笔者联系。

    展开全文
  • 首先请看下图: 在很久很久以前,我测试东西的时候发现鼠标指向任务栏与托盘(就是右下角显示时间的地方)时不显示浅黄色提示了,仔细看了下原来是被任务栏和前台窗口遮住了。这问题时有时无,当时也没怎么在意,...

    首先请看下图:

    13cc97d9941aeb1210df9b42.jpg


      在很久很久以前,我测试东西的时候发现鼠标指向任务栏与托盘区(就是右下角显示时间的地方)时不显示浅黄色提示了,仔细看了下原来是被任务栏和前台窗口遮住了。这问题时有时无,当时也没怎么在意,反正用的不多。今天测试东西的时候又出现了,于是上网Google了一圈,找到KZTechs.COM里一篇文章,说是tooltips的topmost属性丢失了。知道原因就好办了,自己写一个吧,也就是枚举窗体再检查这个窗体是否为tooltips,是的话就以topmost的方式显示出来。关键代码如下:

    GetClassName(handle,buf,260);
    if AnsiSameText(buf,'tooltips_class32') then
        SetWindowPos(handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);

    编译好的软件请到我的网盘下载:http://hbxfwjww.ys168.com

    转载于:https://www.cnblogs.com/lxwy/archive/2010/06/30/4420666.html

    展开全文
  • XP安装SP2,关闭任务栏自动更新提示图标的方法1、XP安装SP2后如果禁用了自动更新或禁用了防火墙任务栏会有一个气球图标的提示,我们可以通过修改注册表来禁用系统提示区中的气球提醒 点左下角开始---运行---regedit...
  • 相信大家基本上每天都要登陆小企鹅吧…那个看了N年的小企鹅…我们...首先要先说一下理论知识,QQ的任务栏小图标是放在哪个文件夹里面的呢?我在网上查找过,最后知道是在一个Res.rdb的文件里面,QQ2010正式版以前是直接
  • 本文主要讲解用C#来实现任务栏通知窗口。 简介 QQ和MSN的任务栏通知窗口很人性化,它可以在不丢失主窗体焦点的前提下显示一个具备皮肤Skin的通知窗体,当它显示一段时间后会自动消失,所以用户根本不用干预它。 这样...
  • 任务栏位置(上下左右)获取

    千次阅读 2016-10-19 23:03:26
    所以有了任务栏位置,就能像QQ一样显示消息提示框,RECT rtClient; ::SystemParametersInfo(SPI_GETWORKAREA,0,(PVOID)&rtClient,0);//获取屏幕工作大小 RECT rcDeskTop; ::GetWindowRect(GetDesktopWindow(),&...
  • Tooltips,即工具条提示,就是我们把光标移到网页上的某张图片,或者工具栏上的某个按钮,再或者任务栏最右侧(似乎没有一个明确的名称,好像很多人管它叫系统托盘)的某个图标上面的时候跑出来的那个黄底黑字的...
  • VB锁键盘程序代码.rar

    2019-07-10 11:25:08
    VB锁键盘程序代码,程序启动后添加图标到任务栏提示区,在任务栏显示小图标,流星键盘锁定软件,运行后限制鼠标活动区域,锁定键盘模块写得比较乱,多数通用变量的声明放在这个模块,还有各个function的声明,该模块...
  • Android 4.0 桌面底部状态修改

    千次阅读 2012-07-03 13:04:12
    Android 4.0 桌面底部状态分为两个部分:左边是三个导航键:从左置右依次是:返回键 ,Home键和RecentApplication键,就是查看最近打开的所有程序,多任务切换就在这里。 这三个键为一个区域 叫NavigationArea,...
  • VB实现敲击键盘发出不同的声音,用键盘演奏出...可选择系统中已有的设备,根据模拟出的乐器类型,演奏出音乐,可对音量和音高进行控件,MID输出部分代码来自池星泽,同时程序可添加图标到任务栏提示区,版权属于wssccc
  • 本软件是由wssccc开发的自由软件,具有鼠标中键操作功能,添加图标到任务栏提示区,使用鼠标隐藏,随Windows加载。程序可枚举当前打开的所有窗体,并可以快速隐藏窗体和标题,适合VB初学者学习参考本源码。
  • 系统环境:Windows 7软件环境:Visual Studio 2008 SP1本次目的:实现系统托盘、气泡提示的效果 系统托盘的效果,大家应该都见过,比如QQ、杀毒软件之类的都会在任务栏驻留.../***该系统需要处理的任务栏状态的...
  • VB托盘图标显示API

    千次阅读 2007-05-01 10:08:00
    Const MAX_TOOLTIP As Integer = 64 Const NIF_ICON = &H2 删除图标 Const NIF_MESSAGE = &H1 Const NIF_TIP = &H4 Const NIM_ADD = &H0 添加图标到任务栏提示区 Const 
  • 做的很简陋,样品都算不上,但感觉基本实用价值有了,不用老去刷网页...最小化后停在任务栏通知: 每隔一段时间访问一次猪八戒网的软件任务页面,发现新的任务就在桌面右下角弹出一个小窗口。  点这里下载...
  • 系统环境:Windows 7软件环境:Visual Studio 2008 SP1本次目的:实现系统托盘、气泡提示的效果系统托盘的效果,大家应该都见过,比如QQ、杀毒软件之类的都会在任务栏驻留图标,这对于一些软件的用处非常大,易于...
  • VC6风格界面

    2013-07-11 19:38:49
    ...................\VC++任务栏提示区图标的实现.doc ...................\VC++动态加入和删除菜单的方法.doc ...................\VC++环境下浮动工具条的编程.doc ...................\VC++环境下菜单和工具...
  • 方法一,重新启动资源管理器,右键点击桌面下方的“任务栏”空白,在弹出的菜单栏中选择“任务管理器”。 进入任务管理器,点击上方的“文件”,选择新建任务。 在弹出的对话框中,输入...
  • 可问题就是无法调试并且在vscode底下任务栏一直提示正在生成。。。 然后我也遇到了这个问题,折腾到最后终于让我发现了问题出在哪: 一旦你对vscode工作或者用户加了这句话,那就会无法调试。这句话原本是为了...
  • 首先介绍一下基本知识: .../***该系统需要处理的任务栏状态的消息***/ typedef struct _NOTIFYICONDATA { DWORD cbSize; //结构体的大小,以字节为单位 HWND hWnd; //窗口的句柄 UINT uID;
  • 友友问:电脑用的是双硬盘,最近系统任务栏弹出一个错误提示信息,提示延缓写入失败,然后在我的电脑中,D盘和F盘消失了。重启后,所有分区都可见,但对D盘或F盘中的数据进行操作时,系统就会假死、蓝屏重启。怎么回...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 242
精华内容 96
关键字:

任务栏提示区