Win32 系统部分函数
2011-04-01 21:32 Clingingboy 阅读(2688) 评论(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);
}
效果
二.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函数…