云计算百科
云计算领域专业知识百科平台

第3章 Windows运行机理-3.1 内核分析(13)

在程序的运行中,可以看见,当程序启动的时候,并没有出现窗口,而是在Windows的任务栏的右下角出现了一个下雨一样的小图标,这叫做托盘方法。实现起来也是很简单,很多资料中都介绍了,这里就不赘述。

#define WM_ICONCALLBACK (WM_USER+0x1234)

 

///////////////////////////////////////////////////

//

// 添加任务条Icon

//

///////////////////////////////////////////////////

int AddShellIcon(void)

{

 LPBYTE lpszTip;

 NOTIFYICONDATA tnid;

 BOOL res; 

 

 if(China)

{

  LoadString(hResInstance,IDS_COOLCPUNAME,

Text,sizeof(Text));

lpszTip=Text;

}

 else lpszTip="CoolCPU";

 

 tnid.cbSize = sizeof(NOTIFYICONDATA); 

 tnid.hWnd = MainWin;

 tnid.uID = 1; 

 tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 

 tnid.uCallbackMessage = WM_ICONCALLBACK;

 tnid.hIcon = hIcon; 

lstrcpyn(tnid.szTip,lpszTip,sizeof(tnid.szTip)); 

    

 res = Shell_NotifyIcon(NIM_ADD, &tnid); 

 return res; 

}

///////////////////////////////////////////////////

//

// 删除任务条Icon

//

///////////////////////////////////////////////////

int DelShellIcon(void)

{

 NOTIFYICONDATA tnid; 

 BOOL res; 

 

 tnid.cbSize = sizeof(NOTIFYICONDATA); 

 tnid.hWnd = MainWin; 

 tnid.uID = 1; 

   

 res = Shell_NotifyIcon(NIM_DELETE, &tnid); 

 return res; 

}

///////////////////////////////////////////////////

//

// 窗口处理函数

//

///////////////////////////////////////////////////

long APIENTRY WndProc( HWND hwnd,UINT message,UINT wParam,

LONG lParam)

{

 POINT ptCurrent;

 PAINTSTRUCT ps;

 

  switch(message)

  {

  case WM_PAINT:

   BeginPaint(hwnd,&ps);

   EndPaint(hwnd,&ps);

   return 0;

  case WM_ICONCALLBACK: //任务条Icon回调消息

   switch(lParam)

    {

    case WM_LBUTTONDBLCLK:

    case WM_LBUTTONDOWN:

    case WM_RBUTTONDOWN:

     GetCursorPos(&ptCurrent);

     SetForegroundWindow(hwnd);

     //显示菜单

     TrackPopupMenu( hPopMenu,

       TPM_RIGHTBUTTON,

       ptCurrent.x,

       ptCurrent.y,

       0,

       hwnd,

       NULL);

     break;

    }

   return 0;

  case WM_INITMENUPOPUP:

   if(lParam==0)

    {

    if(WinNT==0 && hCVxD!=INVALID_HANDLE_VALUE)

     {    

     if(EnableHlt)

                     CheckMenuItem((HMENU)wParam,

ID_COOLCPU,

MF_BYCOMMAND|MF_CHECKED);

     else 

CheckMenuItem((HMENU)wParam,

ID_COOLCPU,

MF_BYCOMMAND|MF_UNCHECKED);

     }

    else 

EnableMenuItem((HMENU)wParam,ID_COOLCPU,

MF_BYCOMMAND|MF_GRAYED);

    }

   return 0;

  case WM_COMMAND:

   switch(wParam)

    {

    case BN_CLICKED:

     break;

 

    case ID_EXIT:

     PostMessage(hwnd,WM_CLOSE,0,0);

     break;

     //Cool Cpu

     case ID_COOLCPU:

      if(WinNT==0)

       {

       if(hCVxD!=INVALID_HANDLE_VALUE)

        {

        EnableHlt^=1;

DeviceIoControl(hCVxD,3,

(LPVOID)NULL,0,

(LPVOID)&EnableHlt,

sizeof(EnableHlt),

&cbBytesReturned,NULL);

        }

       }

      break;

    }

   break;

  case WM_DESTROY:

          PostQuitMessage(0);

   break;

  case WM_CLOSE:

   break;

  }

 

return (DefWindowProc(hwnd,message,wParam,lParam));

}

我们可以通过Windows的系统资源监视器看到,当降温程序打开时,CPU的占用率会马上提高,当降温程序关闭时,CPU的占用率又马上恢复原值。这是因为系统资源监视器也是通过空闲时调用的方法实现的,所以当降温程序工作时,CPU就会暂停了,就好像是占用了很多的资源。

 

赞(0)
未经允许不得转载:网硕互联帮助中心 » 第3章 Windows运行机理-3.1 内核分析(13)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!