编程技巧15法之一

类别:VC语言 点击:0 评论:0 推荐:
  如何禁止/启用屏幕保护等编程技巧

作者:徐景周(部分引自:soundman32、JHawkZZ)

 

1.         如何激活和关闭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);

}

 

2.         如何给树控件加入工具提示

l         首先给树控件加入TVS_INFOTIP属性风格,如下所示:

if (!m_ctrlTree.Create(WS_CHILD|WS_VISIBLE|

       TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_INFOTIP, //加入提示TVS_INFOTIP,jingzhou xu(树控件ID:100)

              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   

 

ON_NOTIFY(TVN_GETINFOTIP, 100, OnGetInfoTip)                        //树控件条目上加入提示,jingzhou xu

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);

 }

 

3.         如何获取系统信息框的路径

#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 );

}

 

4.         如何直接运行一个资源中的程序

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;

}

 

5.         如何遍历整个目录

#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 );

}

 

6.         如何实现窗口到系统区图标间的动画效果

//********************************************************************************

//* 名称: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);

}

 

7.         如何判断当前操作系统的版本

//------------------------------------------------------------------------------------------------

//判断操作系统涵数及变量,jingzhou xu

typedef enum tagWin32SysType{

       Windows32s,

       WindowsNT3,

       Windows95,

       Windows98,

       WindowsME,

       WindowsNT4,

       Windows2000,

       WindowsXP

}Win32SysType;

 

//判断操作系统涵数及变量,jingzhou xu

Win32SysType IsShellSysType()

{

       Win32SysType  ShellType;

       DWORD winVer;

       OSVERSIONINFO *osvi;

      

       winVer=GetVersion();

       if(winVer<0x80000000){/*NT */

              ShellType=WindowsNT3;

              osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));

              if (osvi!=NULL){

                     memset(osvi,0,sizeof(OSVERSIONINFO));

                     osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);

                     GetVersionEx(osvi);

                     if(osvi->dwMajorVersion==4L)ShellType=WindowsNT4;

                     else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==0L)ShellType=Windows2000;

                     else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==1L)ShellType=WindowsXP;

                     free(osvi);

              }

       }

       else if  (LOBYTE(LOWORD(winVer))<4)

              ShellType=Windows32s;

       else{

              ShellType=Windows95;

              osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));

              if (osvi!=NULL){

                     memset(osvi,0,sizeof(OSVERSIONINFO));

                     osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);

                     GetVersionEx(osvi);

                     if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==10L)ShellType=Windows98;

                     else if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==90L)ShellType=WindowsME;

                     free(osvi);

              }

       }

 

       return ShellType;

}

file://------------------------------------------------------------------------------------------------

本文地址:http://com.8s8s.com/it/it2303.htm