Windows API 函数学习(11)---一个关机程序的源代码

来源:互联网 发布:数据库路由器软件icx 编辑:程序博客网 时间:2024/05/16 09:41

 // dlgMain.cpp : Defines the entry point for the application.
//一个关机程序。

#include "stdafx.h"
#include "resource.h"
#include <stdio.h>
#include < Shellapi.h>
HINSTANCE hInst;
HICON hIcon;
int hour,minute;
NOTIFYICONDATA nib;
char temp[32];
#define WM_NOTIFYICON WM_USER+1
BOOL IsBegin;
BOOL DlgProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
    hInst=hInstance;
 DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG),0,(DLGPROC)DlgProc,(IDD_DIALOG));
 return 0;
}
BOOL DlgProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 int lowID;
 int i;
 SYSTEMTIME sm;
 char tt[50];
 switch (uMsg){
 case WM_INITDIALOG:
  hIcon=LoadIcon( hInst , MAKEINTRESOURCE(IDI_ICON1));//加载图标
  SetClassLong(hWnd,GCL_HICON,(long)hIcon);//设置对话框的图标
  SetTimer(hWnd,1,100,NULL);
        for(i=0;i<24;i++)
  {
    sprintf(tt,"%02d",i);
    SendMessage(GetDlgItem(hWnd,IDC_HOUR),CB_ADDSTRING,0,(LPARAM)tt);
  }
  for(i=0;i<60;i++)
  {
   sprintf(tt,"%02d",i);
   SendMessage(GetDlgItem(hWnd,IDC_MINUTE),CB_ADDSTRING,0,(LPARAM)tt);
  }
  break;
 case WM_COMMAND:
  lowID=LOWORD(wParam);
     switch(lowID)
  {
  case IDC_HOUR:
   if(HIWORD(wParam)==LBN_SELCHANGE)
   {
    hour=SendMessage(GetDlgItem(hWnd,IDC_HOUR),CB_GETCURSEL,0,0);
   }
   break;
  case IDC_MINUTE:
   if(HIWORD(wParam)==LBN_SELCHANGE)
   {
    minute=SendMessage(GetDlgItem(hWnd,IDC_MINUTE),CB_GETCURSEL,0,0);
   }
   break;
  case ID_START:
   IsBegin=TRUE;
   nib.cbSize=sizeof(NOTIFYICONDATA);
   nib.hIcon=hIcon;
   nib.hWnd=hWnd;
   nib.uCallbackMessage=WM_NOTIFYICON;//自定义消息
            nib.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
   nib.uID=IDI_ICON1;
   sprintf(temp,"关机时间:%02d:%02d",hour,minute);
   strcpy(nib.szTip,temp);
   Shell_NotifyIcon(NIM_ADD,&nib);//缩小为图标
   ShowWindow(hWnd,SW_HIDE);
   break;
  }
  case WM_NOTIFYICON://自定义消息处理
   if(wParam==IDI_ICON1)
   {
    switch(lParam)
    {
    case WM_LBUTTONDBLCLK://双击可以将窗口还原
     Shell_NotifyIcon(NIM_DELETE,&nib);
     ShowWindow(hWnd,SW_SHOWNORMAL);
     break;
    }
   
   }
   
   break;
 case WM_TIMER:
  GetLocalTime(&sm);
  GetTimeFormat(NULL,TIME_FORCE24HOURFORMAT,&sm,"hh':'mm':'ss",tt+wsprintf(tt," %d-%02d-%02d ",sm.wYear,sm.wMonth,sm.wDay),50);
  SetDlgItemText(hWnd,IDC_CURTIME,tt);
  if(IsBegin&&hour==sm.wHour&&minute==sm.wMinute)
  {
   OSVERSIONINFO osinfo;
   osinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
   GetVersionEx(&osinfo);
   if(osinfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)//判断是不是Windows系统
   {
    if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
    {
                    MessageBox(NULL,"ExitWindowsEx Error!","Error",MB_OK);
     return 0;
    }
    PostQuitMessage(0);
   }
   else if(osinfo.dwPlatformId==VER_PLATFORM_WIN32_NT)//判断是不是NT系统,对NT系统需要提升权限
   {
                HANDLE hToken;
                TOKEN_PRIVILEGES tkp;
    if (!OpenProcessToken(GetCurrentProcess(),
     TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    { 
     MessageBox(NULL,"OpenProcessToken","Error",MB_OK);
        return 0;
    }
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
     &tkp.Privileges[0].Luid);
    tkp.PrivilegeCount = 1;     
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
    if (GetLastError() != ERROR_SUCCESS)
    {
     MessageBox(NULL,"AdjustTokenPrivileges","Error",MB_OK);
     return 0;
    }
    if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
    {
                    MessageBox(NULL,"ExitWindowsEx Error!","Error",MB_OK);
     return 0;
    }
   }
  
  }
  break;
 case WM_CLOSE:
  KillTimer(hWnd,1);
  EndDialog(hWnd,FALSE);
  break;
 default:
  return FALSE;
 }
 return TRUE;
}


原创粉丝点击