在屏幕右下角缩成图标用Shell_NotifyIcon;
快捷键用RegisterHotKey和UnRegisterHotKey;

解决方案 »

  1.   

    Shell_NotifyIcon()
    第一个参数
    NIM_ADD新建一个任务栏图标
    NIM_MODIFY修改.........
    NIM_DELETE删除.........
    第二个参数
    NOTIFYICONDATA结构
    详细的看msdn吧
      

  2.   

    使用VC和VB对系统托盘编程的方法
    Windows下许多程序都在系统托盘——屏幕右下角(Windows时间、输入法显示位置)显示程序图标,比如金山词霸、PC-cillin、SQL Server等,如何进行少量编程实现这一功能?WinApi提供了一个函数,帮助实现系统托盘图标的显示、删除、闪动等。在此,作者根据自己的实际经验提供在Visual Basic和Visual C++下的编程方法。
    一、 WinApi的Shell_NotifyIcon函数介绍
    WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
        DWORD dwMessage, 
        PNOTIFYICONDATA pnid);
    参数说明:
    DWORD  dwMessage 有三个选择:
    0——NIM_ADD     在系统托盘加上图标 
    1——NIM_DELETE  删除系统托盘上的图标
    2——NIM_MODIFY  更换系统托盘上的图标
    pnid是PNOTIFYICONDATA数据类型,包括
    PNOTIFYICONDATA数据结构如下:
    typedef struct _NOTIFYICONDATA { 
        DWORD cbSize;                                      //本数据结构的字节数
        HWND hWnd;                           //图标所属的Windows程序窗口句柄
        UINT uID; 
            UINT uFlags;       //让图标变量NIF_ICON 、鼠标移动到图标处的事件变量      NIF_TIP、信息变量NIF_MESSAGE有效
        UINT uCallbackMessage;       //在图标位置的发生鼠标事件时向程序发送的消息
        HICON hIcon;                                                  //图标指针
    char szTip[64];                    //当鼠标移动到图标位置时,自动显示的文字
    } NOTIFYICONDATA, *PNOTIFYICONDATA;二、在Visual Basic下的使用方法
    1、 声明
    Option Explicit
    Private Type NOTIFYICONDATA    ' 定义NOTIFYICONDATA数据类型
        cbSize As Long
        hWnd As Long
        uId As Long
        uFlags As Long
        ucallbackMessage As Long
        hIcon As Long
        szTip As String * 64
    End Type
    ' 定义对图标操作的常量
    Private Const NIM_ADD = &H0  ' 增加图标
    Private Const NIM_MODIFY = &H1 ' 改变图标
    Private Const NIM_DELETE = &H2  ' 删除图标
    ' 以下定义鼠标事件常量
    Private Const WM_MOUSEMOVE = &H200  ' 鼠标移动常量
    Private Const WM_LBUTTONDBLCLK = &H203   ' 双击左鼠标按钮
    Private Const WM_LBUTTONDOWN = &H201     ' 左鼠标按钮按下
    Private Const WM_LBUTTONUP = &H202       ' 松开左鼠标按钮
    Private Const WM_RBUTTONDBLCLK = &H206   ' 双击右鼠标按钮
    Private Const WM_RBUTTONDOWN = &H204     ' 右鼠标按钮按下
    Private Const WM_RBUTTONUP = &H205       ' 松开右鼠标按钮
    Private Const NIF_MESSAGE = &H1
    Private Const NIF_ICON = &H2
    Private Const NIF_TIP = &H4
    ' WinApi函数Shell_NotifyIcon声明
    Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
    ' 定义NOTIFYICONDATA类型变量
    Dim t As NOTIFYICONDATA
    2、 方法
    ' 当程序运行时对变量t的赋值
    Private Sub Form_Load()
        t.cbSize = Len(t)
        t.hwnd = Form1.hwnd
        t.uId = 1&
        t.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
        t.ucallbackMessage = WM_MOUSEMOVE
        't.ucallbackMessage = WM_LBUTTONUP
        t.hIcon = Form1.Icon
        t.szTip = "这是我的系统托盘程序"
    End Sub
    ' 鼠标对图标操作事件的处理——体现在鼠标移动事件上
    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single)
        Dim msg As Long
        Dim sFilter As String
        msg = x / Screen.TwipsPerPixelX  '鼠标按下时的按钮信息
        Select Case msg
           Case WM_LBUTTONDOWN ' 左鼠标按下事件
                Me.Show ' 单击图标时显示程序窗口
           Case WM_LBUTTONUP ' 左鼠标松开事件
           Case WM_LBUTTONDBLCLK ' 左鼠标双击事件
           Case WM_RBUTTONDOWN ' 右鼠标按下事件
                Me.PopupMenu system  ' 右鼠标按下时弹出菜单system是自定义的菜单
           Case WM_RBUTTONUP ' 右鼠标松开事件
           Case WM_RBUTTONDBLCLK  ' 右鼠标双击事件
        End Select
    End Sub3、 改变图标
        Shell_NotifyIcon NIM_DELETE, t
        If t.hIcon = Form2.Icon Then t.hIcon = Form1.Icon Else t.hIcon = Form2.Icon
    Shell_NotifyIcon NIM_ADD, t三、 在Visual C++下的使用方法
    在Visual C++下实现时可以不用声明,直接使用函数
       在窗口显示事件时赋值变量,并显示系统托盘图标
    void ::OnShowWindow(BOOL bShow, UINT nStatus) 
    {
    ::OnShowWindow(bShow, nStatus);
    // TODO: Add your message handler code here
    if(nStatus){
    BOOL res; 
    NOTIFYICONDATA tnid; 
        tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd =m_hWnd; 
    tnid.uID = 1; 
    tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
    //tnid.uCallbackMessage = MYWM_NOTIFYICON; 
        tnid.hIcon = m_hIcon; 
            strcpy(tnid.szTip, "这是我的第一个系统托盘程序!\0"); 
    res = Shell_NotifyIcon(NIM_ADD, &tnid); 
      if (m_hIcon) 
    DestroyIcon(m_hIcon); 
    }
    }
    其他操作类似Visual Basic下的使用方法。