代码改变世界

Win32 系统部分函数

2011-04-01 21:32  Clingingboy  阅读(2684)  评论(1编辑  收藏  举报

 

一.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函数…