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;
}
//一个关机程序。
#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;
}
相关文章推荐
- Windows API 函数学习(11)---一个关机程序的源代码
- 如何用python制作一个锻炼计算能力的exe小程序-学习笔记11-pyinstaller
- 一个非常非常非常基础的程序,写的不好,但是一般的文件读写操作及字符处理函数都涉及到了..新手学习用的
- 171109-宏定义指令和命名空间的学习以及一个函数程序练习【连续第十七天】
- 习题 4.6 有一个函数:y=x (x<1) y=2x-1 (1<=x<10) y=3x-11 (x>=10) 写程序,输入x的值,输出y相应的值。
- CGI程序学习(5)-用到的工具和一个不错的集成html网页源代码
- 聊聊程序员如何学习英语单词:写了一个记单词的小程序
- 写的一个获取 某程序 运行所需时间的函数: 用到了abstract, final等
- uC/OS II学习时的一个重要函数 OSInit( );
- 编写程序将一个百分制成绩转换为五分制成绩,并用函数实现。
- 网络编程:以一个聊天程序结束这个学习。
- es6中箭头函数学习的一个记录
- es6中箭头函数学习的一个记录
- 程序开发基础学习三(boost::bind 函数学习)
- 入职学习(1)--一个程序员的成长史(21)
- 在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全路径名(转)
- 一个 Android程序员的小程序入门学习笔记『三』(自定义属性和获取属性)
- Java学习之关于静态修饰符的一个小程序
- QT学习之阻拦退出程序函数以及事件过滤器的使用,以及文件的操作。
- VB学习第十三周几种常见程序源代码