#include
#include "resource.h"
#include //注意这个头文件,要想使用扩展的一些控件就要用这个头文件
#pragma comment(lib,"comctl32.lib")//编译时增加comctl32.lib,里面有扩展控件的接口。
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
static TCHAR szAppName[] = TEXT ("SDKAutoOff") ;
TCHAR time[4];//定义这个字符数组的目的是向combo box(我不知道中文怎么翻译)加入字串。
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MSG msg ;
HWND hwnd ;
WNDCLASS wndclass ;
HMENU hMenu;
int ci;
InitCommonControls();
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = DLGWINDOWEXTRA ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance,LPSTR(ID_NOTIFYICON)) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE+1) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd=CreateDialog(hInstance,szAppName,NULL,NULL) ;//我用的是 CreateDialog 函数来创建一个对话框。
hMenu=GetSystemMenu(hwnd,FALSE);//得到系统菜单的的菜单句柄。
AppendMenu(hMenu,MF_STRING,IDM_SYS_ABOUT,"关于...");//向系统菜单中加入一个项目,字串为“关于...”,ID号为IDM_SYS_ABOUT。
for(ci=0;ci<24;ci++)//用循环语句将24个小时加入到combo box中。
{
if(ci<=9)
wsprintf(time,"0%d",ci);
else
wsprintf(time,"%d",ci);
SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_ADDSTRING,0,LPARAM(time));//向combo box发送CB_ADDSTRING消息加入字串。
}
for(ci=0;ci<60;ci++)//用循环语句将60分钟加入到combo box中。
{
if(ci<=9)
wsprintf(time,"0%d",ci);
else
wsprintf(time,"%d",ci);
SendMessage(GetDlgItem(hwnd,IDC_COMBO2),CB_ADDSTRING,0,LPARAM(time));//同上
}
ShowWindow (hwnd, iCmdShow);//显示窗口
UpdateWindow (hwnd);//刷新窗口
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HINSTANCE hInstance ;
static HMENU htaskmenu;
SYSTEMTIME st;//定义一个时间结构用来储存GetLocalTime函数得到的时间。
TCHAR time[50];//定义显示在静态框中的时间字串。
POINT point;//当程序缩小为任务栏的图标时,点击右键所存储的坐标值。
UINT uID;//定义任务栏中图标的ID值。
UINT uMsg;//定义当用户对任务栏图标进行操作时,程序windows向程序发送的消息。
TCHAR tip[30];//定义当用户鼠标放到任务栏图标上时,所显示的文字字串。
NOTIFYICONDATA nid;
nid.cbSize=sizeof(NOTIFYICONDATA);
strcpy(nid.szTip,"开始");
nid.hWnd=hwnd;
nid.uID=ID_NOTIFYICON;
nid.uCallbackMessage=WM_NOTIFYICON;
nid.hIcon=LoadIcon(hInstance,LPSTR(ID_NOTIFYICON));
nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
static int hour,minute;//定义关机的小时和分钟。
static BOOL IsBegin=FALSE;//定义关机标志,当为TRUE时,开启自动关机的功能
switch (message)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;//初始化获得程序实例句柄。
SetTimer(hwnd,ID_TIMER,100,NULL);//设定一个程序记时器。使windows每隔1/10秒向程序发一个WM_TIMER消息。
htaskmenu=LoadMenu(hInstance,szAppName);//读入菜单,获得菜单句柄。
htaskmenu=GetSubMenu(htaskmenu,0);//设置为右键点击弹出菜单
return 0 ;
case WM_TIMER://捕获WM_TIMER消息
GetLocalTime(&st);//获得系统时间
GetTimeFormat(NULL,TIME_FORCE24HOURFORMAT,&st,"HH';:';mm';:';ss",time+wsprintf(time," %d-%d-%d ",st.wYear,st.wMonth,st.wDay),50);//将时间转换为标准显示格式存储到time数组中
SetWindowText(GetDlgItem(hwnd,IDC_STATIC1),time);//将时间显示到静态框中。
if(IsBegin&&(hour==st.wHour)&&(minute==st.wMinute))//当关机标志为开并且当自动关机时间到了的时候关机。
{
ExitWindowsEx(0,0);//调用ExitWindowsEx关闭机器。
PostQuitMessage(0);
}
return 0;
case WM_NOTIFYICON://当对任务栏的图标操作时windows发送WM_NOTIFYICON消息
uID=wParam;//图标的ID值
uMsg=lParam;//用户对任务栏图标进行的是什么操作
if(uID==ID_NOTIFYICON)
{
switch(uMsg)
{
case WM_RBUTTONDOWN://如果是单击右键
GetCursorPos(&point);//获得单击的坐标位置
TrackPopupMenuEx(htaskmenu,TPM_VERTICAL|TPM_LEFTALIGN,point.x,point.y,hwnd,NULL);//在单击的位置上显示弹出菜单
break;
}
}
return 0;
case WM_DESTROY:
KillTimer (hwnd,ID_TIMER);
PostQuitMessage (0) ;
return 0 ;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BEGIN://当点击了开始按钮
//wsprintf(tip,"关机时间:%d时%d分",hour,minute);
//strcpy(nid.szTip,tip);//当用户鼠标放在任务栏图标上时所显示的内容
//Shell_NotifyIcon(NIM_ADD,&nid);//在任务栏中加入一个图标
IsBegin=TRUE;//将关机标志设为TRUE
// ShowWindow(hwnd,0);//将主窗口隐藏
return 0;
case IDC_COMBO1:
if(HIWORD(wParam)==LBN_SELCHANGE)//当用户改变了小时combo box的选项。
hour=SendMessage((HWND)lParam,CB_GETCURSEL,0,0); //将关机小时存储到变量hour中
return 0;
case IDC_COMBO2://当用户改变了分钟combo box的选项后,将关机分钟存储到变量minute中
if(HIWORD(wParam)==LBN_SELCHANGE)
minute=SendMessage((HWND)lParam,CB_GETCURSEL,0,0);
return 0;
case IDM_STOP://当用户在弹出的菜单上选择了关闭时
ShowWindow(hwnd,1);//恢复窗口
IsBegin=FALSE;//关机标志设为FALSE
Shell_NotifyIcon(NIM_DELETE,&nid);//删除图标
return 0;
case ID_ABOU://当用户点击了弹出菜单的关于后
MessageBox(hwnd,"(c)枣子(wutao8@263.net)-vc之路\n2001 http://vcroad.6to23.com","sdk的自动关机",0);
return 0;
}
case WM_SYSCOMMAND:
switch(LOWORD(wParam))
{
case IDM_SYS_ABOUT://当用户点击了系统菜单的关于后
MessageBox(hwnd,"(c)枣子(wutao8@263.net)-vc之路\n2001 http://vcroad.6to23.com","sdk的自动关机",0);
return 0;
}
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
下面是调试好的程序。 |