编程技巧20法 (上)

[代码如下]
编程技巧20法 (上)
发布时间:



1. 如 何 激 活 当 前 屏 幕 保 护 程 序
// 激活当前屏幕保护程序, jingzhou xu
PostMessage(WM_SYSCOMMAND,SC_SCREENSAVE,0);

2. 如 何 禁 止/启 用 屏 幕 保 护 及 电 源 管 理
static UINT dss_GetList[]={    SPI_GETLOWPOWERTIMEOUT,SPI_GETPOWEROFFTIMEOUT,SPI_GETSCREENSAVETIMEOUT};

static UINT dss_SetList[]={    SPI_SETLOWPOWERTIMEOUT,SPI_SETPOWEROFFTIMEOUT,SPI_SETSCREENSAVETIMEOUT};

static const int dss_ListCount=_countof(dss_GetList);
l 禁 止 屏 幕 保 护 及 电 源 管 理
{
    m_pValue= new int [dss_ListCount];
     for ( int x=0;x<dss_ListCount;x++)
    {
         // 禁止屏幕保护及电源管理
        VERIFY(SystemParametersInfo(dss_SetList[x],0,NULL,0));
    }
     delete []m_pValue ;
}

l 启 用 屏 幕 保 护 及 电 源 管 理
{
    m_pValue= new int [dss_ListCount];
     for ( int x=0;x<dss_ListCount;x++)
    {
         //启用屏幕保护及电源管理
        VERIFY(SystemParametersInfo(dss_SetList[x],m_pValue[x],NULL,0));
    }
     delete []m_pValue ;
}

3. 如 何 激 活 和 关 闭 IE 浏 览 器
//激活并打开IE
void lounchIE()
{
     HWND h=FindWindowEx(NULL,NULL,NULL, "Microsoft Internet Explorer" );
    ShellExecute(h, "open" , "C://simple.html" ,  NULL,NULL,SW_SHOWNORMAL);
}

//关闭IE及其它应用
void CloseIE()
{
     int app=BSM_APPLICATIONS ;
    unsigned long bsm_app=(unsigned long )app ;
    BroadcastSystemMessage(BSF_POSTMESSAGE,&bsm_app, WM_CLOSE,NULL,NULL);
}

4. 如 何 给 树 控 件 加 入 工 具 提 示
l 首 先 给 树 控 件 加 入 TVS_INFOTIP 属 性 风 格 , 如 下 所 示 :
if (!m_ctrlTree.Create(WS_CHILD|WS_VISIBLE|
//加入提示TVS_INFOTIP,jingzhou xu(树控件ID:100)
TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_INFOTIP,CRect(0,0,0,0),&m_wndTreeBar,100))
{
    TRACE0( "Failed to create instant bar child/n" );
     return -1 ;
}
l 其 次 加 入 映 射 消 息 声 明 , 如 下 所 示 :
afx_msg void OnGetInfoTip(NMHDR*pNMHDR, LRESULT *pResult);
//树控件上加入提示消息,jingzhou xu

//树控件条目上加入提示,jingzhou xu
ON_NOTIFY(TVN_GETINFOTIP,100,OnGetInfoTip)
l 最 后 加 入 呼 应 涵 数 处 理 :
void CCreateTreeDlg :: OnGetInfoTip(NMHDR*pNMHDR, LRESULT *pResult)
{
    *pResult=0 ;
    NMTVGETINFOTIP*pTVTipInfo=(NMTVGETINFOTIP*)pNMHDR ;
     LPARAM itemData=( DWORD )pTVTipInfo->lParam ;
     //对应每个条目的数据
    HTREEITEM hItem=pTVTipInfo->hItem ;
    CString tip ;
    HTREEITEM hRootItem=m_chassisTree.GetRootItem();
     if (hRootItem!=pTVTipInfo->hItem)
    {
        tip= "树结点的提示" ;
    }
     else
    {
        tip= "树根上的提示" ;
    }
    strcpy(pTVTipInfo->pszText,( LPCTSTR )tip);
}

5. 如 何 获 取 系 统 信 息 框 的 路 径
#include<atlbase.h>

#define IDS_REG_KEY_MSINFO_PATH1 _T("Software//Microsoft//Shared Tools//MSInfo")
#define IDS_REG_KEY_MSINFO_PATH2 _T("Software//Microsoft//Shared Tools Location")
#define IDS_REG_VAL_MSINFO_PATH1 _T("Path")
#define IDS_REG_VAL_MSINFO_PATH2 _T("MSInfo")
#define IDS_MSINFO_EXE_NAME _T("MSInfo32.exe")

//...

BOOL GetSysInfoPath(CString&strPath)
{
    strPath.Empty();
     LPTSTR pszPath=strPath.GetBuffer(MAX_PATH);
    
    CRegKey reg ;
     DWORD dwSize=MAX_PATH ;
     LONG nRet=reg.Open(HKEY_LOCAL_MACHINE,IDS_REG_KEY_MSINFO_PATH1,KEY_READ);
    
     // 在注册表中寻找第一个"MSInfo32.exe" 位置
     if (nRet==ERROR_SUCCESS)
    {
        #if(_MFC_VER>=0x0700)
        nRet=reg.QueryStringValue(IDS_REG_VAL_MSINFO_PATH1,pszPath,&dwSize);
        #else
        nRet=reg.QueryValue(pszPath,IDS_REG_VAL_MSINFO_PATH1,&dwSize);
        #endif
        
        reg.Close();
    }
    
     // 如果第一次寻找失败,则进行第二次寻找
     if (nRet!=ERROR_SUCCESS)
    {
        nRet=reg.Open(HKEY_LOCAL_MACHINE,IDS_REG_KEY_MSINFO_PATH2,KEY_READ);
        
         if (nRet==ERROR_SUCCESS)
        {
            #if(_MFC_VER>=0x0700)
            reg.QueryStringValue(IDS_REG_VAL_MSINFO_PATH2,pszPath,&dwSize);
            #else
            reg.QueryValue(pszPath,IDS_REG_VAL_MSINFO_PATH2,&dwSize);
            #endif
            
             // 路径名不包括EXE文件名
             if (nRet==ERROR_SUCCESS)
            VERIFY(:: PathAppend(pszPath,IDS_MSINFO_EXE_NAME));
            
            reg.Close();
        }
    }
    
    strPath.ReleaseBuffer();
    strPath.FreeExtra();
    
     // 检查文件是否有效.
     return :: PathFileExists(strPath);
}

6. 如 何 直 接 运 行 一 个 资 源 中 的 程 序
bool Run()
{
    CFile f ;
     char *pFileName= "Execution.exe" ;
     if (!f.Open(pFileName,CFile :: modeCreate|CFile :: modeWrite,NULL))
    {
        AfxMessageBox( "Can not create file!" );
         return 0 ;
    }
    CString path=f.GetFilePath();
     HGLOBAL hRes ;
     HRSRC hResInfo ;
     //获取应用实例
     HINSTANCE insApp=AfxGetInstanceHandle();
     //寻找EXE资源名
    hResInfo=FindResource(insApp,( LPCSTR )IDR_EXE4, "EXE" );
    hRes=LoadResource(insApp,hResInfo);
     // Load it
     DWORD dFileLength=SizeofResource(insApp,hResInfo);
     //计算EXE文件大小
    f.WriteHuge(( LPSTR )hRes,dFileLength);
     //写入临时文件
    f.Close();
     HINSTANCE HINSsd=ShellExecute(NULL, "open" ,path,NULL,NULL,SW_SHOWNORMAL);
     //运行它.
    > return 1 ;
}

7. 如 何 遍 历 整 个 目 录
#include<windows.h>
#include<shlobj.h>

//浏览目录.
void BrowseFolder( void )
{
     TCHAR path[MAX_PATH];
    BROWSEINFO bi={ 0 } ;
    bi.lpszTitle=( "递归调用所有目录" );
    LPITEMIDLIST pidl=SHBrowseForFolder(&bi);
    
     if (pidl!=0)
    {
         // 获取目录路径
        SHGetPathFromIDList(pidl,path);
        
         //设置为当前路径
        SetCurrentDirectory(path);
        
         //搜索所有子目录
        SearchFolder(path);
        
        
         // 释放内存
        IMalloc*imalloc=0 ;
         if (SUCCEEDED(SHGetMalloc(&imalloc)))
        {
            imalloc->Free(pidl);
            imalloc->Release();
        }
    }
}

//搜索其下所有子目录及文件.
void SearchFolder( TCHAR *path)
{
    WIN32_FIND_DATA FindFileData ;
     HANDLE hFind ;
    
     TCHAR filename[MAX_PATH+256];
     TCHAR pathbak[MAX_PATH];
    
     //复制初始用户选择目录
    strcpy(pathbak,path);
    
     //寻找第一个文件
    hFind=FindFirstFile( "*.*" ,&FindFileData);
    
     //搜索所有文件及子目录
     do
    {
         if (hFind!=INVALID_HANDLE_VALUE)
        {
             //如果是当前目录或父目录,跳过
             if (!(strcmp(FindFileData.cFileName, "." ))||!(strcmp(FindFileData.cFileName, ".." )))
            {
                 continue ;
            }
            
             //恢复初始用户选择目录
            strcpy(path,pathbak);
            
             //列出所有发现的文件
            sprintf(path, "%s//%s" ,path,FindFileData.cFileName);
            
             //如果 SetCurrentDirectory 成功的话,则它是一个目录,递归调用继续搜索子目录
             if ((SetCurrentDirectory(path)))
            {
                SearchFolder(path);
            }
            
             //插入文件及路径名到列表框m_listbox_hwnd中
            SendMessage(m_listbox_hwnd,LB_ADDSTRING,0,path);
             //<--INSERT WHAT YOU WANT DONE HERE!
        }
    }
     while (FindNextFile(hFind,&FindFileData)&&hFind!=INVALID_HANDLE_VALUE);
    
    FindClose(hFind);
}

8. 如 何 禁 止/启 用 系 统 热 键
bool bOld ;
l 禁 止 系 统 热 键
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, true ,&bOld,SPIF_UPDATEINIFILE);

l 启 用 系 统 热 键
//恢复系统热键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, false ,&bOld,SPIF_UPDATEINIFILE);

9. 如 何 隐 藏/显 示 WINDOWS 系 统 任 务 栏
l 隐 藏 系 统 任 务 栏
//隐藏WINDOWS系统任务栏
:: ShowWindow(:: FindWindow( "Shell_TrayWnd" ,NULL),SW_HIDE);
l 显 示 系 统 任 务 栏
//恢复WINDOWS系统任务栏正常显示
:: ShowWindow(:: FindWindow( "Shell_TrayWnd" ,NULL),SW_SHOW);

10. 如 何 实 现 窗 口 到 系 统 区 图 标 间 的 动 画 效 果
//********************************************************************************
//* 名称:FindTrayWnd
//* 作者:徐景周([email protected])
//* 功能:在显示窗体动画效果前,先寻找系统区位置
//********************************************************************************
BOOL CALLBACK FindTrayWnd( HWND hwnd, LPARAM lParam)
{
     TCHAR szClassName[256];
    GetClassName(hwnd,szClassName,255);
    
     // 比较窗口类名
     if (_tcscmp(szClassName,_T( "TrayNotifyWnd" ))==0)
    {
        CRect*pRect=(CRect*)lParam ;
        :: GetWindowRect(hwnd,pRect);
         return TRUE ;
    }
    
     // 当找到时钟窗口时表示可以结束了
     if (_tcscmp(szClassName,_T( "TrayClockWClass" ))==0)
    {
        CRect*pRect=(CRect*)lParam ;
        CRect rectClock ;
        :: GetWindowRect(hwnd,rectClock);
        pRect->right=rectClock.left ;
         return FALSE ;
    }
    
     return TRUE ;
}

//********************************************************************************
//* 名称:WinAnimation
//* 作者:徐景周([email protected])
//* 功能:显示窗口动画效果的涵数
//********************************************************************************
void CScreenSnapDlg :: WinAnimation( BOOL ShowFlag)
{
    CRect rect(0,0,0,0);
    
     // 查找托盘窗口
    CWnd*pWnd=FindWindow( "Shell_TrayWnd" ,NULL);
     if (pWnd)
    {
        pWnd->GetWindowRect(rect);
        EnumChildWindows(pWnd->m_hWnd,FindTrayWnd,( LPARAM )&rect);
         //rect 为托盘区矩形
        CRect rcWnd ;
        GetWindowRect(rcWnd);
         //窗体滑向系统区
         if (ShowFlag)DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rcWnd,rect);
         //窗体从系统区滑出
         else DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rect,rcWnd);
    }
}

用 法 如 下 :
//窗体是否已隐藏
if (IsWindowVisible())
{
    ShowWindow(SW_HIDE);
     //先隐藏窗体
    WinAnimation( true );
     //窗体动画滑入到系统区中
}
else
{
    WinAnimation( false );
     //窗体动画从系统区滑出
    ShowWindow(SW_SHOW);
}

你可能感兴趣的:(编程,windows,Microsoft,null,exe,Path)