l 注销,重启,关闭计算机
BOOL ExitWindowsEx(
UINT uFlags,//注销:EWX_LOGOFF,重启:EWX_REBOOT,
DWORD dwReserved
);
//重启,关闭计算机时候需要判断操作系统的类型。
OSVERSIONINFO OsVersionInfo;
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo);
if( OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
::ExitWindowsEx(EWX_SHUTDOWN, 0);
//获取操作系统名称和版本号,以及操作系统目录
//访问注册表
::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
"Software//microsoft//Windows NT//CurrentVersion",
0, KEY_QUERY_VALUE, &hKey);
RegQueryValueEx(hKey, "ProductName", NULL, &Type, Data, &Size);//名称
RegQueryValueEx(hKey, "SystemRoot", NULL, &Type, Data, &Size);//系统目录
OSVERSIONINFO Info;
Info.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&Info);
m_strVersion.Format("%d.%d %s 内部版本号%d", Info.dwMajorVersion,
Info.dwMinorVersion, Info.szCSDVersion, Info.dwBuildNumber);//版本号
l 获取硬件信息
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
switch(SysInfo.wProcessorArchitecture)//CPU的体系结构
{
case PROCESSOR_ARCHITECTURE_INTEL://只识别Intel的CPU
strText="Intel ";
break;
default: strText="未知类型CPU";
}
if(SysInfo.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL)
{
switch(SysInfo.wProcessorLevel) //CPU型号
{
case 3: strText+="80386"; break;
case 4: strText+="80486"; break;
case 5: strText+="Pentium"; break;
case 6: strText+="Pentium3"; break;
case 7: strText+="Pentium4"; break;
default: strText+="x86";
}
}
l 内存
MEMORYSTATUS MemInfo;
GlobalMemoryStatus(&MemInfo);//获取内存信息
MemInfo.dwTotalPhys//总的物理内存
MemInfo.dwAvailPhys//可用物理内存
MemInfo.dwTotalPageFile//分页文件空间
MemInfo.dwAvailPageFile//可用分页文件空间
MemInfo.dwTotalVirtual//总的虚拟内存
l 屏蔽和恢复系统热键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,1,NULL,0);//屏蔽
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,0,NULL,0);//恢复
l 枚举正在运行的程序
#include <tlhelp32.h>
//初始化
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};
//获得句柄
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == (HANDLE)-1)
{
printf("/nCreateToolhelp32Snapshot()failed:%d",GetLastError());
return;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
//列举所有进程名称
if (Process32First(hProcessSnap, &pe32))
{
do
{
//将进程名加到列表中
m_ctrlLstPorcesses.AddString(pe32.szExeFile);
}
while (Process32Next(hProcessSnap, &pe32));//直到列举完毕
}
else
{
printf("/nProcess32Firstt() failed:%d",GetLastError());
}
//关闭句柄
CloseHandle (hProcessSnap);
l 启动并控制其他exe程序
PROCESS_INFORMATION pi;
STARTUPINFO si;
//初始化变量
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
//打开记事本程序
BOOL fRet=CreateProcess(NULL,
"c://windows//notepad.exe c://autoexec.bat",//记事本程序
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi);
m_hPro=pi.hProcess;
TerminateProcess(m_hPro,0);//终止程序
l 禁止运行程序的多个实例
CWnd *pWndPrev, *pWndChild;
//根据主窗口类名和主窗口名判断是否已经有实例存在了
if (pWndPrev = CWnd::FindWindow(_T("#32770"),"OnlyOne"))
{
//如果存在就将其激活,并显示出来
pWndChild = pWndPrev->GetLastActivePopup();
//如果是最小化的就还原窗口
if (pWndPrev->IsIconic())
pWndPrev->ShowWindow(SW_RESTORE);
pWndChild->SetForegroundWindow();
return FALSE;
}
l 禁止窗体右上角各个按钮
//使最小化按钮无效,最大化按钮类似
//获得窗口风格
LONG style = ::GetWindowLong(m_hWnd,GWL_STYLE);
//设置新的风格
style &= ~(WS_MINIMIZEBOX);
::SetWindowLong(m_hWnd,GWL_STYLE,style);
//重化窗口边框
CRect rc;
GetWindowRect(&rc);
::SetWindowPos(m_hWnd,HWND_NOTOPMOST,rc.left,rc.top,rc.Width(),rc.Height(),SWP_DRAWFRAME);
//使关闭按钮无效
//获得系统菜单
CMenu *pMenu=GetSystemMenu(FALSE);
//获得关闭按钮的ID
int x=pMenu->GetMenuItemCount();
UINT pID=pMenu->GetMenuItemID(x-1);
//使关闭按钮无效
pMenu->EnableMenuItem(pID, MF_DISABLED);
l 剪贴板实现进程之间的通信
//打开系统剪贴板
if (OpenClipboard())
{
//使用之前,清空系统剪贴板
EmptyClipboard();
//分配一内存,大小等于要拷贝的字符串的大小,返回一的内存控制句柄
HGLOBAL hClipboardData;
hClipboardData = GlobalAlloc(GMEM_DDESHARE, strData.GetLength()+1);
//内存控制句柄加锁,返回值为指向那内存控制句柄所在的特定数据格式的指针
char * pchData;
pchData = (char*)GlobalLock(hClipboardData);
//将本地变量的值赋给全局内存
strcpy(pchData, LPCSTR(strData));
//给加锁的全局内存控制句柄解锁
GlobalUnlock(hClipboardData);
//通过全局内存句柄将要拷贝的数据放到剪贴板上
SetClipboardData(CF_TEXT,hClipboardData);
//使用完后关闭剪贴板
CloseClipboard();
}
//打开系统剪贴板
if (OpenClipboard())
{
//判断剪贴板上的数据是否是指定的数据格式
if (::IsClipboardFormatAvailable(CF_TEXT)|| ::IsClipboardFormatAvailable(CF_OEMTEXT))
{
// Retrieve the Clipboard data (specifying that
// we want ANSI text (via the CF_TEXT value).
//从剪贴板上获得数据
HANDLE hClipboardData = GetClipboardData(CF_TEXT);
//通过给内存句柄加锁,获得指向指定格式数据的指针
char *pchData = (char*)GlobalLock(hClipboardData);
//本地变量获得数据
CString strFromClipboard = pchData;
m_edtFromClipboard.SetWindowText(strFromClipboard);
//给内存句柄解锁
GlobalUnlock(hClipboardData);
}
}
l 通过消息机制来实现进程通信
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);//找到要接收的窗口
if(pWnd) pWnd->SendMessage(WM_COMM,0,0);
l 获取系统安装目录
char path[MAX_PATH] = {'/0'};
GetSystemDirectory(path,MAX_PATH);
l 注册系统热键
ATOM m_atomId;
//向操作系统添加一个全局原子Atom m_atomId,
m_atomId = GlobalAddAtom("myHotKey");
//设定ALT+Z为热键,尽量使用比较生疏的键。
if(!RegisterHotKey(m_hWnd, m_atomId, MOD_ALT, 'Z'))
m_bRegister = FALSE;
else
m_bRegister = TRUE;
//定义消息
ON_MESSAGE(WM_HOTKEY,OnHotKey)
l 获得所有磁盘和磁盘驱动器
//获得实际存储驱动器号的字符串长度
dwNumBytesForDriveStrings=GetLogicalDriveStrings(0,NULL)*sizeof(TCHAR);
//如果字符串不为空,则表示有正常的驱动器存在
if (dwNumBytesForDriveStrings!=0) {
//分配字符串空间
hHeap=GetProcessHeap();
lp=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,
dwNumBytesForDriveStrings);
//获得标明所有驱动器的字符串
GetLogicalDriveStrings(HeapSize(hHeap,0,lp),lp);
//将驱动器一个个放到下拉框中
while (*lp!=0) {
Driver->AddString(lp);
lp=_tcschr(lp,0)+1;
}
}
//获得驱动器序列号
LPCTSTR lpRootPathName = strRootPathName;
LPTSTR lpVolumeNameBuffer=new char[12];
DWORD nVolumeNameSize=12;
DWORD VolumeSerialNumber;
DWORD MaximumComponentLength;
DWORD FileSystemFlags;
LPTSTR lpFileSystemNameBuffer=new char[10];
DWORD nFileSystemNameSize=10;
GetVolumeInformation(lpRootPathName,
lpVolumeNameBuffer, nVolumeNameSize,
&VolumeSerialNumber,
&MaximumComponentLength,
&FileSystemFlags,
lpFileSystemNameBuffer, nFileSystemNameSize);
//显示驱动器序列号
CString str;
str.Format("驱动器%s的序列号为%x",strRootPathName,VolumeSerialNumber);
AfxMessageBox(str);
l 获取磁盘剩余空间
//获得磁盘空间信息
ULARGE_INTEGER FreeAv,TotalBytes,FreeBytes;
if(GetDiskFreeSpaceEx(Driver,&FreeAv,&TotalBytes,&FreeBytes))
{
//格式化信息,并显示出来
CString strTotalBytes,strFreeBytes;
strTotalBytes.Format("%u字节",TotalBytes.QuadPart);
strFreeBytes.Format("%u字节",FreeBytes.QuadPart);
CStatic* pTotalStatic = (CStatic*)GetDlgItem(IDC_TOTAL);
CStatic* pFreeStatic = (CStatic*)GetDlgItem(IDC_FREE);
pTotalStatic->SetWindowText(strTotalBytes);
pFreeStatic->SetWindowText(strFreeBytes);
}
l 获取文件属性
CFileStatus rStatus;
if(CFile::GetStatus(m_strFile,rStatus))
{
m_strSize.Format("%d字节",rStatus.m_size);
m_strCTime = rStatus.m_ctime.Format("%Y年%m月%d日%H:%M:%S");
m_strMTime = rStatus.m_mtime.Format("%Y年%m月%d日%H:%M:%S");
m_strATime = rStatus.m_atime.Format("%Y年%m月%d日%H:%M:%S");
//判断是否只读
if((rStatus.m_attribute & 0x01) == 0x01)
m_bReadOnly = TRUE;
else
m_bReadOnly = FALSE;
//判断是否隐藏
if((rStatus.m_attribute & 0x02) == 0x02)
m_bHidden = TRUE;
else
m_bHidden = FALSE;
//判断是否存档
if((rStatus.m_attribute & 0x20) == 0x20)
m_bArchive = TRUE;
else
m_bArchive = FALSE;
//判断是否是系统文件
if((rStatus.m_attribute & 0x04) == 0x04)
m_bSystem = TRUE;
else
m_bSystem = FALSE;
UpdateData(FALSE);
}
l 拷贝文件,移动文件
CopyFile
//移动文件
MoveFile
l Ini文件操作
//写入
int nCount = m_lstLeft.GetCount();
for(int i=0;i<nCount;i++)
{
//将学生写入ini文件
CString strKeyName,strStudentName;
m_lstLeft.GetText(i,strStudentName);
strKeyName.Format("Name%d",i);
::WritePrivateProfileString("StudentName",strKeyName,strStudentName,".//Student.ini");
}
//将学生数量写入ini文件
CString strCount;
strCount.Format("%d",nCount);
::WritePrivateProfileString("StudentCount","Count",strCount,".//Student.ini");
//写入后的ini文件
[StudentName]
Name0=学生0
Name1=学生1
Name2=学生2
Name3=学生3
Name4=学生4
Name5=学生5
[StudentCount]
Count=6
//读出
//从ini文件中获得数量
int nCount =::GetPrivateProfileInt("StudentCount","Count",0,".//Student.ini");
for(int i=0;i<nCount;i++)
{
//从ini文件中获得学生,并加到右边列表中
CString strKeyName,strStudentName;
strKeyName.Format("Name%d",i);
::GetPrivateProfileString("StudentName",strKeyName,NULL,strStudentName.GetBuffer(128),128,".//Student.ini");
m_lstRight.AddString(strStudentName);
}
l 文件拷贝
char strSrc[]="D://*.*/0";
//可以改变源路径
char strDst[]="F:///0"; //设置目的路径
char strTitle[]="File copying";
//进度题头
SHFILEOPSTRUCT FileOp;
FileOp.hwnd=m_hWnd;
FileOp.wFunc=FO_COPY;
//执行文件拷贝
FileOp.pFrom=strSrc;
FileOp.pTo=strDst;
FileOp.fFlags=FOF_ALLOWUNDO;
FileOp.hNameMappings=NULL;
FileOp.lpszProgressTitle=strTitle;
nOk=SHFileOperation(&FileOp);
l 用CStdioFile读写文件
CStdioFile类是CFile类的派生类,主要是为了读写文本文件(如txt,cpp等)而设置的。该类新
增的成员方法CStdioFile::ReadString和CStdioFile::WriteString对文件读写整行的字符串非常方便。