• Win32 系统部分函数


    一.GetSystemMetrics

    返回与windows环境有关的信息

    void CDemoDlg::OnTest() 
    {
        CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST);
        pListBox->ResetContent();
    
        int nWidth = 0;
        int nHeight = 0;
        CString strText = _T("");
    
        //屏幕大小
        strText.Format(_T("屏幕大小:           %d × %d"), 
            GetSystemMetrics(SM_CXSCREEN), 
            GetSystemMetrics(SM_CYSCREEN));
        pListBox->AddString(strText);
    
        //全屏窗口客户区大小
        strText.Format(_T("全屏窗口客户区大小: %d × %d"), 
            GetSystemMetrics(SM_CXFULLSCREEN), 
            GetSystemMetrics(SM_CYFULLSCREEN));
        pListBox->AddString(strText);
    
        //最大化窗口大小
        strText.Format(_T("最大化窗口大小:     %d × %d"), 
            GetSystemMetrics(SM_CXMAXIMIZED), 
            GetSystemMetrics(SM_CYMAXIMIZED));
        pListBox->AddString(strText);
    
        //最小化窗口大小
        strText.Format(_T("最小化窗口大小:     %d × %d"), 
            GetSystemMetrics(SM_CXMINIMIZED), 
            GetSystemMetrics(SM_CYMINIMIZED));
        pListBox->AddString(strText);
    
        //窗口边界大小
        strText.Format(_T("窗口边界大小:       %d × %d"), 
            GetSystemMetrics(SM_CXBORDER), 
            GetSystemMetrics(SM_CYBORDER));
        pListBox->AddString(strText);
    
        //固定框架厚度
        strText.Format(_T("固定框架厚度:       %d × %d"), 
            GetSystemMetrics(SM_CXFIXEDFRAME), 
            GetSystemMetrics(SM_CYFIXEDFRAME));
        pListBox->AddString(strText);
    
        //可变框架厚度
        strText.Format(_T("可变框架厚度:       %d × %d"), 
            GetSystemMetrics(SM_CXSIZEFRAME), 
            GetSystemMetrics(SM_CYSIZEFRAME));
        pListBox->AddString(strText);
                                    
        //水平滚动条箭头大小
        strText.Format(_T("水平滚动条箭头大小: %d × %d"), 
            GetSystemMetrics(SM_CXHSCROLL), 
            GetSystemMetrics(SM_CYHSCROLL));
        pListBox->AddString(strText);
    
        //垂直滚动条箭头大小
        strText.Format(_T("垂直滚动条箭头大小: %d × %d"), 
            GetSystemMetrics(SM_CXVSCROLL), 
            GetSystemMetrics(SM_CYVSCROLL));
        pListBox->AddString(strText);
    
        //标题栏高度
        strText.Format(_T("标题栏高度:         %d"), 
            GetSystemMetrics(SM_CYCAPTION));
        pListBox->AddString(strText);
    
        //标题栏按钮大小
        strText.Format(_T("标题栏按钮大小:     %d × %d"), 
            GetSystemMetrics(SM_CXSIZE), 
            GetSystemMetrics(SM_CYSIZE));
        pListBox->AddString(strText);
    
        //菜单栏高度
        strText.Format(_T("菜单栏高度:         %d"), 
            GetSystemMetrics(SM_CYMENU));
        pListBox->AddString(strText);
    
        //光标大小
        strText.Format(_T(""));
        strText.Format(_T("光标大小:           %d × %d"), 
            GetSystemMetrics(SM_CXCURSOR), 
            GetSystemMetrics(SM_CYCURSOR));
        pListBox->AddString(strText);
    
        //图标大小
        strText.Format(_T(""));
        strText.Format(_T("默认图标大小:       %d × %d"), 
            GetSystemMetrics(SM_CXICON), 
            GetSystemMetrics(SM_CYICON));
        pListBox->AddString(strText);
    }
    

    效果

    image

    二.GetSysColor

    //获得显示元素的颜色
    COLORREF crColor = ::GetSysColor(COLOR_3DFACE);
    

    三.SystemParametersInfo

    获取(GET)和设置(SET)数量众多的windows系统参数.

    应用1:屏幕保护程序

    如下GET取参数,SET设置参数

    void CDemoDlg::OnTest() 
    {
        BOOL bActive = FALSE;
    
        //判断屏幕保护程序是否启用
        SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bActive, 0);
    
        if (bActive)
        {
            //禁用屏幕保护程序
            if (SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0))
            {
                SetDlgItemText(IDC_TEST, _T("启用屏幕保护程序"));
    
                AfxMessageBox(_T("禁用屏幕保护程序成功。"));
            }
            else
            {
                AfxMessageBox(_T("禁用屏幕保护程序失败。"));
            }
        }
        else
        {
            //启用屏幕保护程序
            if (SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0))
            {
                SetDlgItemText(IDC_TEST, _T("禁用屏幕保护程序"));
    
                AfxMessageBox(_T("启用屏幕保护程序成功。"));
            }
            else
            {
                AfxMessageBox(_T("启用屏幕保护程序失败。"));
            }
        }
    }
    

    应用2:设置桌面壁纸

    //获得文件路径
    CString strPathName = dlg.GetPathName();
    
    //设置桌面墙纸
    if (SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (void*)(LPCTSTR)strPathName, 
        SPIF_UPDATEINIFILE))
    {
        AfxMessageBox(_T("设置桌面墙纸成功。"));
    }
    else
    {
        AfxMessageBox(_T("设置桌面墙纸失败。"));
    }
    

     

    四.执行屏幕保护程序

    发送内置的SC_SCREENSAVE命令

    void CDemoDlg::OnTest() 
    {
        Sleep(1000);
    
        //执行屏幕保护程序
        ::SendMessage(m_hWnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
    }
    

    五.执行外部程序

    有三种方法

    void CDemoDlg::OnTest1() 
    {
        //运行计算器应用程序
        WinExec(_T("calc.exe"), SW_SHOW);
    }
    
    void CDemoDlg::OnTest2() 
    {
        //运行计算器应用程序
        ShellExecute(m_hWnd, _T("open"), _T("calc.exe"),
            _T(""), _T(""), SW_SHOW);    
    }
    
    void CDemoDlg::OnTest3() 
    {
        STARTUPINFO StartupInfo;
        PROCESS_INFORMATION ProcessInformation;
        ZeroMemory(&StartupInfo, sizeof(StartupInfo));
        StartupInfo.cb = sizeof(StartupInfo);
    
        //运行计算器应用程序
        ::CreateProcess(NULL, _T("calc.exe"), NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, 
            NULL, NULL, &StartupInfo, &ProcessInformation);
    }
    
    

    参考:http://hi.baidu.com/%BF%AA%D0%C4de%B9%FB%D7%D3/blog/item/e343b710735a2dcaa6ef3f05.html

    六.打开我的电脑和我的文档

    也是用ShellExecute方法

    void CDemoDlg::OnTest1() 
    {
        //打开我的电脑
        ShellExecute(NULL, NULL, "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
            NULL, NULL, SW_SHOWNORMAL);
    }
    
    void CDemoDlg::OnTest2() 
    {
        //打开我的文档
        ShellExecute(NULL, NULL, "::{450D8FBA-AD25-11D0-98A8-0800361B1103}",
            NULL, NULL, SW_SHOWNORMAL);
    }
    

    七.让应用程序只有一个实例

    利用互斥体

    //创建互斥量
    m_hMutex = ::CreateMutex(NULL, FALSE, _T("DemoApp"));
    
    //判断互斥量是否存在
    if (GetLastError() == ERROR_ALREADY_EXISTS)    
    {
        AfxMessageBox("应用程序已经运行。");
        return FALSE;    
    }
    else
    {
        AfxMessageBox("应用程序第一次运行。");
    }
    

    八.把应用程序调至前台

    即把程序调到桌面的最前面

    //创建互斥量
    m_hMutex = ::CreateMutex(NULL, FALSE, _T("DemoApp"));
    
    //判断互斥量是否存在
    if (GetLastError() == ERROR_ALREADY_EXISTS)    
    {
        //获得桌面窗口
        CWnd* pDesktopWnd = CWnd::GetDesktopWindow();
    
        //获得第一个子窗口
        CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);
    
        while (pWnd != NULL) 
        {
            //获得窗口标志
            if (::GetProp(pWnd->m_hWnd, m_pszExeName))
            {    
                 //激活窗口
                pWnd->SetForegroundWindow();
    
                pWnd->SetDlgItemText(IDC_TEXT, _T("应用程序已经运行。"));
    
                return FALSE; 
            }
    
            // 继续寻找下一个窗口 
            pWnd = pWnd->GetWindow(GW_HWNDNEXT);
        }
    
         return FALSE;    
     }
    

    九.注销,关闭,重启操作系统

    利用ExitWindowsEx函数和不同参数

    //注销系统
    ExitWindowsEx(EWX_LOGOFF, 0);
    //关闭系统
    ExitWindowsEx(EWX_SHUTDOWN, 0);
    //重启系统
    ExitWindowsEx(EWX_REBOOT, 0);
    

    十.获得系统时间和当前时间

    两个方法GetSystemTime和GetCurrentTime

    void CDemoDlg::OnTest() 
    {
        SYSTEMTIME systime;
    
        //获得系统时间
        ::GetSystemTime(&systime);
    
        CString strText = _T("");
        strText.Format(_T("%d-%d-%d\n%d:%d:%d"), 
            systime.wYear, systime.wMonth, systime.wDay,
            systime.wHour, systime.wMinute, systime.wSecond);
        AfxMessageBox(strText);
    }
    
    void CDemoDlg::OnTest() 
    {
        CTime time;
     
        //获得当前时间
        time = CTime::GetCurrentTime();
    
        CString strText = _T("");
        strText.Format(_T("%d-%d-%d\n%d:%d:%d"),
            time.GetYear(), time.GetMonth(), time.GetDay(),
            time.GetHour(), time.GetMinute(), time.GetSecond());
        AfxMessageBox(strText);
    }
    

    十一.使用定时器

    即KillTimer和SetTimer再加一个回调函数

    void CDemoDlg::OnTest1() 
    {
        m_nTime = 0;
        UpdateData(FALSE);
    
        //取消定时器
        KillTimer(1);
    
        //设置定时器
        SetTimer(1, 1000, NULL);
    }
    
    void CDemoDlg::OnTest2() 
    {
        //取消定时器
        KillTimer(1);    
    }
    
    void CDemoDlg::OnTimer(UINT nIDEvent) 
    {
        if (nIDEvent == 1)
        {
            m_nTime++;
            UpdateData(FALSE);
        }
    
        CDialog::OnTimer(nIDEvent);
    }
    

    十二.获取计算机运行时间

    GetTickCount会精准计算当前计算机从开机一直运行的时间,如下计算间隔

    void CDemoDlg::OnTest() 
    {
        //开始时间
        DWORD dwStart = GetTickCount();
    
        for (int i = 0; i < 10000; i++)
        {
            for (int j = 0; j < 10000; j++)
            {
            }
        }
    
        //结束时间
        DWORD dwStop = GetTickCount();
    
        //时间间隔
        DWORD dwElapse = dwStop - dwStart;
    
        CString strText = _T("");
        strText.Format(_T("时间间隔:%d毫秒"), dwElapse);
        AfxMessageBox(strText);
    }
    

    十二.获取计算机名和用户名

    即GetUserName和GetComputerName函数…

  • 相关阅读:
    遍历卷,遍历磁盘
    宽字符
    GetSystemDirectory
    WIN32_FILE_ATTRIBUTE_DATA structure
    几条shell命令
    log4j学习(二)不同类的日志输出到不同的文件
    Java中的split和join
    如何使用socket进行java网络编程(二)
    如何使用socket进行java网络编程(一)
    log4j学习(一)最简单的例子
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2002689.html
Copyright © 2020-2023  润新知