编程技巧15法之一

    技术2022-05-11  147

    如何禁止/启用屏幕保护等编程技巧

    作者:徐景周(部分引自:soundman32JHawkZZ)

     

    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_INFOTIPjingzhou 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

    //* 作者:徐景周(jingzhou_xu@163.net)

    //* 功能:在显示窗体动画效果前,先寻找系统区位置

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

           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

    //* 作者:徐景周(jingzhou_xu@163.net)

    //* 功能:显示窗口动画效果的涵数

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

    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://------------------------------------------------------------------------------------------------

    最新回复(0)