您的位置:首页 > 编程语言

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

2007-04-05 16:11 633 查看
// 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐