MFC编写自动关机程序

来源:互联网 发布:网络大电影平台 编辑:程序博客网 时间:2024/06/02 11:42

           这个东西对自己没多大的用途,写它纯粹是因为最近比较闲,想好好的学一下MFC,代码不算多,可是由于对MFC框架和界面操作的不熟悉导致我吐血了一天才完成,难怪别人说Delphi程序员要比MFC程序员长寿20年-_-#

           下面是界面截图

          FUCK CSDN的图片上传挂了两周多了还没修好,直接贴代码了,MFC的框架映射关系真烦琐-_-#

          AutoShutDownDlg.cpp:

      

// AutoShutDownDlg.cpp : 实现文件
//


#include "stdafx.h"
#
include "AutoShutDown.h"
#
include "AutoShutDownDlg.h"

#ifdef _DEBUG
#
define new DEBUG_NEW
#
endif

#define WM_TRAYMESSAGE WM_USER+10000;


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框


class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// 对话框数据
    enum { IDD = IDD_ABOUTBOX };

    
protected:
    
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现

protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg
::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg
::DoDataExchange(CDataExchange* pDX)
{
    CDialog
::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg
, CDialog)
END_MESSAGE_MAP()


// CAutoShutDownDlg 对话框




CAutoShutDownDlg
::CAutoShutDownDlg(CWnd* pParent /*=NULL*/)
    
: CDialog(CAutoShutDownDlg::IDD, pParent)
    
, m_Radio(0)
{
    m_NowTime 
= _T("");
    m_ShutTime 
= CTime::GetCurrentTime();
    m_IsRun 
= false;
    m_IsShow 
= true;
    m_hIcon 
= AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CAutoShutDownDlg
::DoDataExchange(CDataExchange* pDX)
{
    CDialog
::DoDataExchange(pDX);
    DDX_Text(pDX
,IDC_STATIC_NOW,m_NowTime);
    DDX_DateTimeCtrl(pDX
,IDC_SHUT_TIME,m_ShutTime);
    DDX_Radio(pDX
,IDC_RADIO1,m_Radio);
}

BEGIN_MESSAGE_MAP(CAutoShutDownDlg
, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_TIMER()
    
//}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_START, &CAutoShutDownDlg::OnBnClickedStart)
    ON_BN_CLICKED(IDC_STOP
, &CAutoShutDownDlg::OnBnClickedStop)
    ON_NOTIFY(DTN_DATETIMECHANGE
, IDC_SHUT_TIME, &CAutoShutDownDlg::OnDtnDatetimechangeShutTime)
    ON_BN_CLICKED(IDC_RADIO1
, &CAutoShutDownDlg::OnBnClickedRadio1)
    ON_BN_CLICKED(IDC_RADIO2
, &CAutoShutDownDlg::OnBnClickedRadio2)
    ON_BN_CLICKED(IDC_RADIO3
, &CAutoShutDownDlg::OnBnClickedRadio3)
    ON_BN_CLICKED(IDC_HIDE
, &CAutoShutDownDlg::OnBnClickedHide)
END_MESSAGE_MAP()


// CAutoShutDownDlg 消息处理程序

BOOL CAutoShutDownDlg
::OnInitDialog()
{
    CDialog
::OnInitDialog();

    
// 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。

    ASSERT((IDM_ABOUTBOX & 0xFFF0== IDM_ABOUTBOX);
    
ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu
* pSysMenu = GetSystemMenu(FALSE);
    
if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu
.LoadString(IDS_ABOUTBOX);
        
if (!strAboutMenu.IsEmpty())
        {
            pSysMenu
->AppendMenu(MF_SEPARATOR);
            pSysMenu
->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作

    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码
    // 设置个定时器

    SetTimer(1,1000,NULL);

    
//搞个托盘
    NOTIFYICONDATA nid;
    nid
.cbSize = sizeof(NOTIFYICONDATA);
    nid
.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid
.hIcon = m_hIcon;
    nid
.uCallbackMessage = WM_TRAYMESSAGE;
    nid
.hWnd = m_hWnd;

    _tcscpy(nid
.szTip,L"定时关机 By Red_angelX");
    nid
.uID = IDR_MAINFRAME;
    Shell_NotifyIcon(NIM_ADD
, &nid);

    
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CAutoShutDownDlg
::OnSysCommand(UINT nID, LPARAM lParam)
{
    
if ((nID & 0xFFF0== IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout
.DoModal();
    }
    
else
    {
        CDialog
::OnSysCommand(nID, lParam);
    }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。


void CAutoShutDownDlg
::OnPaint()
{
    
if (IsIconic())
    {
        CPaintDC dc(this); 
// 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND
, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        
// 使图标在工作矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon 
= GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(
&rect);
        int x 
= (rect.Width() - cxIcon + 1/ 2;
        int y 
= (rect.Height() - cyIcon + 1/ 2;

        
// 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    
else
    {
        CDialog
::OnPaint();
    }
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//

HCURSOR CAutoShutDownDlg::OnQueryDragIcon()
{
    
return static_cast<HCURSOR>(m_hIcon);
}

LRESULT CAutoShutDownDlg
::DefWindowProcW(UINT message,WPARAM wParam,LPARAM lParam)
{
    
switch(message)
    {
    
case WM_SYSCOMMAND:
        
if(wParam==SC_MINIMIZE)
        {
            
//CDialog::OnSysCommand(wParam,lParam);
            //AfxGetMainWnd()->ShowWindow(SW_HIDE); 

        }
        
break;
    
case WM_USER+10000:
        {
            
if(lParam == WM_LBUTTONDBLCLK)
            {
                
if(m_IsShow == false)
                {
                    ShowWindow(SW_SHOW);
                    m_IsShow 
= true;
                }
                
else
                {
                    ShowWindow(SW_HIDE);
                    m_IsShow 
= false;
                }
            }
        }
        
break;
    }
    
return CDialog::DefWindowProcW(message,wParam,lParam);
}

void CAutoShutDownDlg
::OnTimer(UINT nIDEvent)
{
    CDialog
::OnTimer(nIDEvent);
    CTime nowtime 
= CTime::GetCurrentTime();
    m_NowTime 
= nowtime.Format(_T("%Y-%m-%d %H:%M:%S"));

    UpdateData(
false);    
    
if(m_IsRun == true)
    {
        
if(CTime::GetCurrentTime() >= m_ShutTime)
        {

            ShutDown();
        }
    }
}


void CAutoShutDownDlg
::OnBnClickedStart()
{
    
// TODO: 在此添加控件通知处理程序代码
    m_StartTime = CTime::GetCurrentTime();

    GetDlgItem(IDC_START)
->EnableWindow(false);
    m_IsRun 
= true;
}

void CAutoShutDownDlg
::OnBnClickedStop()
{
    
// TODO: 在此添加控件通知处理程序代码
    GetDlgItem(IDC_START)->EnableWindow(true);
    m_IsRun 
= false;
}

bool CAutoShutDownDlg
::ShutDown()
{
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;

    
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
        
return false;

    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)
        
return false;

    
switch(m_Radio)
    {
    
case 0:
        
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) 
            
return false;
        
break;
    
case 1:
        
if(!ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0))
            
return false;
        
break;
    
case 2:
        
if(!ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0))
            
return false;
        
break;
    }
    
return true;
}

void CAutoShutDownDlg
::OnDtnDatetimechangeShutTime(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMDATETIMECHANGE pDTChange 
= reinterpret_cast<LPNMDATETIMECHANGE>(pNMHDR);
    
// TODO: 在此添加控件通知处理程序代码
    UpdateData(true);
    
*pResult = 0;
}

void CAutoShutDownDlg
::OnBnClickedRadio1()
{
    
// TODO: 在此添加控件通知处理程序代码
    UpdateData(true);
}

void CAutoShutDownDlg
::OnBnClickedRadio2()
{
    
// TODO: 在此添加控件通知处理程序代码
    UpdateData(true);
}

void CAutoShutDownDlg
::OnBnClickedRadio3()
{
    
// TODO: 在此添加控件通知处理程序代码
    UpdateData(true);
}

void CAutoShutDownDlg
::OnBnClickedHide()
{
    
// TODO: 在此添加控件通知处理程序代码
    ShowWindow(SW_HIDE);
    m_IsShow 
= false;
}

 

 

// AutoShutDownDlg.h : 头文件
//


#pragma once
#
include "atltime.h"


// CAutoShutDownDlg 对话框

class CAutoShutDownDlg : public CDialog
{
// 构造
public:
    CAutoShutDownDlg(CWnd
* pParent = NULL);    // 标准构造函数

// 对话框数据

    enum { IDD = IDD_AUTOSHUTDOWN_DIALOG };
    CString m_NowTime;
    CTime m_StartTime;
    CTime m_ShutTime;
    bool m_IsRun;
    bool m_IsShow;

    
protected:
    
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持


// 实现

protected:
    HICON m_hIcon;

    
// 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID
, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg LRESULT DefWindowProcW(UINT message
,WPARAM wParam,LPARAM lParam);
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnBnClickedStart();
public:
    afx_msg void OnBnClickedStop();
public:
    bool ShutDown();
public:
    afx_msg void OnDtnDatetimechangeShutTime(NMHDR 
*pNMHDR, LRESULT *pResult);
public:
    int m_Radio;
public:
    afx_msg void OnBnClickedRadio1();
public:
    afx_msg void OnBnClickedRadio2();
public:
    afx_msg void OnBnClickedRadio3();
public:
    afx_msg void OnBnClickedHide();
};

           功能就不介绍了,就是满大街都是的自动关机程序,仅仅是自己初步的学习

原创粉丝点击