VC编程技巧1 .

 

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对文件读写整行的字符串非常方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值