c++托盘处理

//创建IOCN
void SetIoc(HWND hwnd)
{
    WNDCLASS wndclass;
    if(hwnd==NULL)
    { 
       MessageBox(NULL, TEXT("应用程序创建托盘处理失败!"), szAppClassName, MB_ICONERROR);return  ;
    }
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = NULL;
    HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
    wndclass.hIcon =hIcon;
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppClassName;
    if(!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("此程序需要Windows NT!"), szAppClassName, MB_ICONERROR);
        return ;
    }
    hwnd = CreateWindowEx(WS_EX_TOOLWINDOW,szAppClassName, szAppWindowName,WS_POPUP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL, NULL, NULL, NULL);
    ShowWindow(hwnd, 0);
    UpdateWindow(hwnd);

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
    NOTIFYICONDATA nid;
    UINT WM_TASKBARCREATED;
    POINT pt;//用于接收鼠标坐标
    int xx;//用于接收菜单选项返回值
    // 不要修改TaskbarCreated,这是系统任务栏自定义的消息
    WM_TASKBARCREATED = RegisterWindowMessage(TEXT("TaskbarCreated"));
    switch (message)
    {
       case WM_CREATE://窗口创建时候的消息.
        nid.cbSize = sizeof(nid);
        nid.hWnd = hwnd;
        nid.uID = IDI_ICON1;     
        nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
        nid.uCallbackMessage = WM_USER;
        nid.hIcon = ::LoadIcon(::GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON1));
        lstrcpy(nid.szTip, szAppClassName);
        Shell_NotifyIcon(NIM_ADD, &nid);
        hmenu=CreatePopupMenu();//生成菜单
        if(SetTuioMode==0)
            AppendMenu(hmenu,MF_UNCHECKED,ID_Tuio,TuioModeText);    
        else 
            AppendMenu(hmenu,MF_CHECKED,ID_Tuio,TuioModeText);
        
        if(SetMouseMode==0)
            AppendMenu(hmenu,MF_UNCHECKED,ID_Mouse,MouseModeText );
        else 
            AppendMenu(hmenu,MF_CHECKED,ID_Mouse,MouseModeText );

        if(SetCalibration==0)
            AppendMenu(hmenu,MF_UNCHECKED,ID_Calibration,CalibrationText );
        else 
           AppendMenu(hmenu,MF_CHECKED,ID_Calibration,CalibrationText );
           
        if(SetBoot_up ==1)
            AppendMenu(hmenu,MF_CHECKED,ID_Boot_up,Boot_upText );
        else if( SetBoot_up ==2)
            AppendMenu(hmenu,MF_UNCHECKED,ID_Boot_up,Boot_upText );
                
        AppendMenu(hmenu,MF_STRING,ID_Close_Exit,Close_ExitText);

        break;
    case WM_USER://连续使用该程序时候的消息.
      /*  if (lParam == WM_LBUTTONDOWN)
            MessageBox(hwnd, TEXT("Win32 API 实现系统托盘程序,双击托盘可以退出!"), szAppClassName, MB_OK);*/
        //双击托盘的消息,退出.
        if (lParam == WM_LBUTTONDBLCLK)
        {
             Close_Exit = true ;
             Sleep(100);
             SendMessage(hwnd, WM_CLOSE, wParam, lParam);
        }
         
        if (lParam == WM_RBUTTONDOWN)
        {
            GetCursorPos(&pt);//取鼠标坐标
            ::SetForegroundWindow(hwnd);//解决在菜单外单击左键菜单不消失的问题
           // EnableMenuItem(hmenu,ID_Close_Exit,MF_GRAYED);//让菜单中的某一项变灰
            xx=TrackPopupMenu(hmenu,TPM_RETURNCMD,pt.x,pt.y,NULL,hwnd,NULL);//显示菜单并获取选项ID
           
            //开机启动
            if(xx==ID_Boot_up)
            {
                 SetBoot_up = SetBootUp(3);    
                if( SetBoot_up==2)
                {
                   if(MessageBox(NULL ,"确定跟随Windows系统一起启动吗?", "图灵识别互动系统", MB_YESNO)==IDYES)
                   {
                     if( SetBootUp(1)==0)
                         CheckMenuItem(hmenu,   ID_Boot_up,   MF_CHECKED);                      
                   }       
                }
                else if( SetBoot_up==1)
                {
                    if(MessageBox(NULL ,"确定关闭Windows系统一起启动吗?", "图灵识别互动系统", MB_YESNO)==IDYES)
                   {
                      if(SetBootUp(2)==0)
                          CheckMenuItem(hmenu,   ID_Boot_up,   MF_UNCHECKED);          
                   }
                }
            }
            //开启鼠标模式
            if(xx==ID_Mouse)
            {
                SetMouseMode= GetPrivateProfileInt("设置", "SetMouseMode", 0, strPath);
                if(SetMouseMode==0)
                {
                      CheckMenuItem(hmenu,   ID_Mouse,   MF_CHECKED);
                      WritePrivateProfileString("设置", "SetMouseMode", "1",   strPath);
                      SetMouseMode=1;
                }
                else 
                {
                     CheckMenuItem(hmenu,   ID_Mouse,   MF_UNCHECKED);
                     WritePrivateProfileString("设置", "SetMouseMode", "0",   strPath);
                     SetMouseMode= 0;
                }    
            }
            //TUIO模式
            if(xx==ID_Tuio)
            {
                   SetTuioMode= GetPrivateProfileInt("设置", "SetTuioMode", 0, strPath);
                  if(SetTuioMode==0)
                  {
                     CheckMenuItem(hmenu,   ID_Tuio,   MF_CHECKED);
                     WritePrivateProfileString("设置", "SetTuioMode", "1",   strPath);
                     SetTuioMode =1;
                  }

                  else 
                  {
                     CheckMenuItem(hmenu,  ID_Tuio,   MF_UNCHECKED); 
                     WritePrivateProfileString("设置", "SetTuioMode", "0",   strPath);
                     SetTuioMode =0;
                  }            
            }

//关闭系统
            if(xx ==ID_Close_Exit)
            {   
                 Close_Exit = true ;
                 Sleep(100);
                 SendMessage(hwnd, WM_CLOSE, wParam, lParam);
            }
            if(xx==0) PostMessage(hwnd,WM_LBUTTONDOWN,NULL,NULL);
            //MessageBox(hwnd, TEXT("右键"), szAppName, MB_OK);
        }
        break;
    case WM_DESTROY://窗口销毁时候的消息.
        Shell_NotifyIcon(NIM_DELETE, &nid);
        PostQuitMessage(0);
        break;

    //捕获系统关机和注销的方法
    case  WM_QUERYENDSESSION:
            Close_Exit = true ;
            Sleep(300);
         //如果以下面的代码执行 ,系统关机和注销都会提示被阻止
       /* if(lParam == 0)
        {
            Close_Exit = true ;
            Sleep(200);
          
            MessageBox(0,"收到关机或重启消息","关机",MB_OK);
            return 1 ;
        }
        else 
        {
            Close_Exit = true ;
            Sleep(200);
            MessageBox(0,"收到注销消息………………………………","0x80000000",MB_OK);
            return 1 ;
        }*/
        break;
        //不管系统有没有关闭再次捕获关闭信息
      case WM_ENDSESSION:
            Close_Exit = true ;
            Sleep(300);
         break;
    default:
        /*
        * 防止当Explorer.exe 崩溃以后,程序在系统系统托盘中的图标就消失
        *
        * 原理:Explorer.exe 重新载入后会重建系统任务栏。当系统任务栏建立的时候会向系统内所有
        * 注册接收TaskbarCreated 消息的顶级窗口发送一条消息,我们只需要捕捉这个消息,并重建系
        * 统托盘的图标即可。
        */
        if (message == WM_TASKBARCREATED)
            SendMessage(hwnd, WM_CREATE, wParam, lParam);
        break;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}
在Min函数:

 while(GetMessage(&msg,NULL, 0, 0))
         {
           if(msg.message ==WM_HOTKEY)
           {
             if(msg.wParam == 0x0001)
             {
               TranslateMessage(&msg);   
               DispatchMessage(&msg);         
             }
           }
         }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Win32控制台托盘是一种用于在Windows操作系统中的控制台应用程序中添加托盘图标的技术。 Win32是一种面向Windows平台的编程技术。它提供了一套应用程序编程接口(API),开发人员可以使用这些接口来创建和管理Windows应用程序。使用Win32编程技术,开发人员可以通过编写C语言或C++代码来实现控制台应用程序。 控制台应用程序是一种以命令行界面为基础的应用程序,通常通过命令行窗口来操作和显示结果。然而,控制台应用程序通常不支持图形用户界面(GUI)的特性,例如窗口和图标。 然而,通过使用Win32控制台托盘技术,开发人员可以在控制台应用程序中添加托盘图标。托盘图标通常显示在任务栏的系统托盘区域,提供快速访问应用程序的功能。 要实现Win32控制台托盘,开发人员需要使用Win32 API中的相关函数和消息。例如,可以使用Shell_NotifyIcon函数来添加、修改或删除托盘图标,使用Shell_NotifyIcon消息来处理托盘图标的操作和事件。 使用Win32控制台托盘技术,开发人员可以为控制台应用程序添加更多的交互性和易用性。用户可以通过右击托盘图标来打开菜单,执行一些预定义的操作,例如显示控制台窗口、关闭应用程序等。 总而言之,Win32控制台托盘是一种在控制台应用程序中实现托盘图标的技术。通过使用相关的Win32 API函数和消息,开发人员可以为控制台应用程序添加更多的用户交互性和易用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值