zoukankan      html  css  js  c++  java
  • 软件管理器

    // SoftWareManagerDlg.cpp : 实现文件
    //
    
    #include "stdafx.h"
    #include "SoftWareManager.h"
    #include "SoftWareManagerDlg.h"
    #include "afxdialogex.h"
    #include "MyList5.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
    BOOL OpenFolderAndSelectFile(TCHAR* szPath);
    class CAboutDlg : public CDialogEx
    {
    public:
        CAboutDlg();
    
    // 对话框数据
        enum { IDD = IDD_ABOUTBOX };
         
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    // 实现
    protected:
        DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()
    
    
    // CSoftWareManagerDlg 对话框
    
    
    
    
    CSoftWareManagerDlg::CSoftWareManagerDlg(CWnd* pParent /*=NULL*/)
        : CDialogEx(CSoftWareManagerDlg::IDD, pParent)
    {
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CSoftWareManagerDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
        DDX_Control(pDX, IDC_LIST1, m_ControlList);
    }
    
    BEGIN_MESSAGE_MAP(CSoftWareManagerDlg, CDialogEx)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_BN_CLICKED(IDC_BUTTON1, &CSoftWareManagerDlg::OnBnClickedButton1)
        ON_BN_CLICKED(IDC_BUTTON2, &CSoftWareManagerDlg::OnBnClickedButton2)
        ON_BN_CLICKED(IDC_BUTTON3, &CSoftWareManagerDlg::OnBnClickedButton3)
    END_MESSAGE_MAP()
    
    
    // CSoftWareManagerDlg 消息处理程序
    
    BOOL CSoftWareManagerDlg::OnInitDialog()
    {
        CDialogEx::OnInitDialog();
    
        // 将“关于...”菜单项添加到系统菜单中。
    
        // IDM_ABOUTBOX 必须在系统命令范围内。
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
        ASSERT(IDM_ABOUTBOX < 0xF000);
    
        CMenu* pSysMenu = GetSystemMenu(FALSE);
        if (pSysMenu != NULL)
        {
            BOOL bNameValid;
            CString strAboutMenu;
            bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
            ASSERT(bNameValid);
            if (!strAboutMenu.IsEmpty())
            {
                pSysMenu->AppendMenu(MF_SEPARATOR);
                pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
            }
        }
    
        // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
        //  执行此操作
        SetIcon(m_hIcon, TRUE);            // 设置大图标
        SetIcon(m_hIcon, FALSE);        // 设置小图标
    
        // TODO: 在此添加额外的初始化代码
          m_Select = -1;
        m_ControlList.AddColumn(4,
            _T("名称"),
            _T("发布者"),
            _T("安装时间"),
            _T("版本"));
        m_ControlList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
        GetSoftwareInfo();
        return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    
    void CSoftWareManagerDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
        {
            CAboutDlg dlgAbout;
            dlgAbout.DoModal();
        }
        else
        {
            CDialogEx::OnSysCommand(nID, lParam);
        }
    }
    
    // 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。
    
    void CSoftWareManagerDlg::OnPaint()
    {
        if (IsIconic())
        {
            CPaintDC dc(this); // 用于绘制的设备上下文
    
            SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
            // 使图标在工作区矩形中居中
            int cxIcon = GetSystemMetrics(SM_CXICON);
            int cyIcon = GetSystemMetrics(SM_CYICON);
            CRect rect;
            GetClientRect(&rect);
            int x = (rect.Width() - cxIcon + 1) / 2;
            int y = (rect.Height() - cyIcon + 1) / 2;
    
            // 绘制图标
            dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
            CDialogEx::OnPaint();
        }
    }
    
    //当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CSoftWareManagerDlg::OnQueryDragIcon()
    {
        return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    
    void CSoftWareManagerDlg::OnBnClickedButton1()
    {
        // TODO: 在此添加控件通知处理程序代码
        CListCtrl    *ListCtrl = NULL;
            if (m_ControlList.IsWindowVisible())
            ListCtrl = &m_ControlList;
        POSITION Pos  = ListCtrl->GetFirstSelectedItemPosition();
        while(Pos)
        {
            m_Select = ListCtrl->GetNextSelectedItem(Pos);
            if (m_vecSoftInfo[m_Select].strSoftInsPath[0])
            {
                OpenFolderAndSelectFile(m_vecSoftInfo[m_Select].strSoftInsPath);
            }
        }
         
        
    }
    
    
    void CSoftWareManagerDlg::OnBnClickedButton2()
    {
        // TODO: 在此添加控件通知处理程序代码
     
            CListCtrl    *ListCtrl = NULL;
            if (m_ControlList.IsWindowVisible())
            ListCtrl = &m_ControlList;
        POSITION Pos  = ListCtrl->GetFirstSelectedItemPosition();
        while(Pos)
        {
            m_Select = ListCtrl->GetNextSelectedItem(Pos);
            if (m_vecSoftInfo[m_Select].strSoftUniPath[0])
            {
                 ShellExecute(NULL, _T("open"),
            m_vecSoftInfo[m_Select].strSoftUniPath, NULL, NULL, SW_SHOWNORMAL);
            }
        }
        
    }
    
    
    void CSoftWareManagerDlg::OnBnClickedButton3()
    {
        // TODO: 在此添加控件通知处理程序代码
        GetSoftwareInfo();
    }
    
    
    //************************************************************
    // 函数名称:    GetSoftwareInfo
    // 函数说明:    获取软件信息
    // 作    者:    cyxvc
    // 时    间:    2015/11/10
    // 返 回    值:    void
    //************************************************************
    void CSoftWareManagerDlg::GetSoftwareInfo()
    {
        m_ControlList.DeleteAllItems();
        m_vecSoftInfo.clear();
        SOFTINFO stcSoftInfo = {0};
        HKEY RootKey;            // 主键
        LPCTSTR lpSubKey;        // 子键名称
        HKEY hkResult;           // 将要打开键的句柄 
        HKEY hkRKey;
        LONG lReturn;            // 记录读取注册表是否成功
        CString strBuffer;
        CString strMidReg;
    
        DWORD index = 0;
        TCHAR szKeyName[255] = { 0 };        // 注册表项名称
        DWORD dwKeyLen = 255;
        DWORD dwNameLen = 255;
        DWORD dwType = 0;
    
        RootKey = HKEY_LOCAL_MACHINE;
        lpSubKey = Is64() ? Win64PATH : Win32PATH;
    
        lReturn = RegOpenKeyEx(RootKey, lpSubKey, 0, 
            KEY_ALL_ACCESS, &hkResult);
        if (lReturn == ERROR_SUCCESS)
        {
            DWORD index = 0;
            DWORD ListIndex = 0;
            while (ERROR_NO_MORE_ITEMS != 
                RegEnumKeyEx(hkResult, index, szKeyName, &dwKeyLen, 
                0, NULL, NULL, NULL))
            {
                strBuffer.Format(_T("%s"), szKeyName);
                if (!strBuffer.IsEmpty())
                {
                    strMidReg = (CString)lpSubKey + _T("\") + strBuffer;
    
                    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, strMidReg, 
                        0, KEY_ALL_ACCESS, &hkRKey) == ERROR_SUCCESS)
                    {
                        RegQueryValueEx(hkRKey, _T("DisplayName"), 
                            0, &dwType, (LPBYTE)stcSoftInfo.szSoftName, &dwNameLen);
                        dwNameLen = 255;
    
                        RegQueryValueEx(hkRKey, _T("DisplayVersion"), 
                            0, &dwType, (LPBYTE)stcSoftInfo.szSoftVer, &dwNameLen);
                        dwNameLen = 255;
    
                        RegQueryValueEx(hkRKey, _T("InstallLocation"), 
                            0, &dwType, (LPBYTE)stcSoftInfo.strSoftInsPath, &dwNameLen);
                        dwNameLen = 255;
    
                        RegQueryValueEx(hkRKey, _T("Publisher"), 
                            0, &dwType, (LPBYTE)stcSoftInfo.strSoftVenRel, &dwNameLen);
                        dwNameLen = 255;
    
                        RegQueryValueEx(hkRKey, _T("UninstallString"), 
                            0, &dwType, (LPBYTE)stcSoftInfo.strSoftUniPath, &dwNameLen);
                        dwNameLen = 255;
    
                        RegQueryValueEx(hkRKey, _T("InstallDate"),
                            0, &dwType, (LPBYTE)stcSoftInfo.szSoftData, &dwNameLen);
                        if (stcSoftInfo.szSoftData[0])
                        {
                            stcSoftInfo.szSoftData[9] = stcSoftInfo.szSoftData[7];
                            stcSoftInfo.szSoftData[8] = stcSoftInfo.szSoftData[6];
                            stcSoftInfo.szSoftData[7] = '-';
                            stcSoftInfo.szSoftData[6] = stcSoftInfo.szSoftData[5];
                            stcSoftInfo.szSoftData[5] = stcSoftInfo.szSoftData[4];
                            stcSoftInfo.szSoftData[4] = '-';
                        }
                        dwNameLen = 255;
    
                        //保存数据
                        if (stcSoftInfo.szSoftName[0]!='')
                        {
                            m_vecSoftInfo.push_back(stcSoftInfo);
    
                            m_ControlList.AddItem(ListIndex++, 4,
                                stcSoftInfo.szSoftName,
                                stcSoftInfo.strSoftVenRel,
                                stcSoftInfo.szSoftData,
                                stcSoftInfo.szSoftVer);
                        }
    
                        index++;
                    }
                    dwKeyLen = 255;
                    memset(szKeyName, 0, 255);
                    memset(&stcSoftInfo, 0, sizeof(SOFTINFO));
                }
            }
            RegCloseKey(hkResult);
        }
    }
    
    
    //************************************************************
    // 函数名称:    Is64
    // 函数说明:    判断系统是否是64位
    // 作    者:    cyxvc
    // 时    间:    2015/11/10
    // 返 回    值:    BOOL
    //************************************************************
    BOOL CSoftWareManagerDlg::Is64()
    {
        SYSTEM_INFO si;
        GetNativeSystemInfo(&si);
        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
            si.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_IA64)
        {
            //64 位操作系统
            return TRUE;
        }
        else
        {
            // 32 位操作系统
            return FALSE;
        }
        return FALSE;
    }
    
    //************************************************************
    // 函数名称:    On32776
    // 函数说明:    打开文件所在位置
    // 作    者:    cyxvc
    // 时    间:    2015/11/10
    // 返 回    值:    void
    //************************************************************
    BOOL OpenFolderAndSelectFile(TCHAR* szPath)
    {
        LPSHELLFOLDER pDesktopFolder;
        if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))
        {
            LPITEMIDLIST     pidl;
            ULONG             chEaten;
            ULONG             dwAttributes;
            HRESULT             hr;
    
            hr = pDesktopFolder->ParseDisplayName(
                NULL, NULL, szPath, &chEaten, &pidl, &dwAttributes);
            if (FAILED(hr))
            {
                pDesktopFolder->Release();
                return FALSE;
            }
            LPCITEMIDLIST pidlFolder = pidl;
    
            CoInitialize(NULL);
            hr = SHOpenFolderAndSelectItems(pidl, 0, NULL, 0);
    
            pDesktopFolder->Release();
    
            if (hr == S_OK)
            {
                return TRUE;
            }
        }
        return FALSE;
    }
     
    
    
    
    // SoftWareManagerDlg.h : 头文件
    //
    
    #pragma once
    #include "MyList5.h"
    #include <vector>
    using namespace std;
    //软件信息结构体
    typedef struct _SOFTINFO
    {
        TCHAR szSoftName[50];                //软件名称
        TCHAR szSoftVer[50];                //软件版本号
        TCHAR strSoftVenRel[50];            //软件发布厂商
        TCHAR szSoftData[20];                //软件安装日期
        TCHAR strSoftInsPath[MAX_PATH];        //软件安装路径
        TCHAR strSoftUniPath[MAX_PATH];        //软件卸载路径
    }SOFTINFO, *PSOFTINFO;
    #define Win32PATH _T("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
    #define Win64PATH _T("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall")
    // CSoftWareManagerDlg 对话框
    class CSoftWareManagerDlg : public CDialogEx
    {
    // 构造
    public:
        CSoftWareManagerDlg(CWnd* pParent = NULL);    // 标准构造函数
    
    // 对话框数据
        enum { IDD = IDD_SOFTWAREMANAGER_DIALOG };
    
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    
    // 实现
    protected:
        HICON m_hIcon;
    
        // 生成的消息映射函数
        virtual BOOL OnInitDialog();
        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
        afx_msg void OnPaint();
        afx_msg HCURSOR OnQueryDragIcon();
        DECLARE_MESSAGE_MAP()
    public:
        CMyList5 m_ControlList;
        //所选则的软件
        int m_Select;
        CString strTemp;
            //保存软件相关信息
        vector<SOFTINFO> m_vecSoftInfo;
        
        BOOL CSoftWareManagerDlg::Is64();
        afx_msg void OnBnClickedButton1();
        afx_msg void OnBnClickedButton2();
        afx_msg void OnBnClickedButton3();
        void CSoftWareManagerDlg::GetSoftwareInfo();
    };
    
    
    
    // MyList5.cpp : 实现文件
    //
    
    #include "stdafx.h"
     
    #include "MyList5.h"
    
    
    // CMyList5
    
    IMPLEMENT_DYNAMIC(CMyList5, CListCtrl)
    
    CMyList5::CMyList5()
    {
    
    }
    
    CMyList5::~CMyList5()
    {
    }
    
    
    BEGIN_MESSAGE_MAP(CMyList5, CListCtrl)
    END_MESSAGE_MAP()
    
    
    
    // CMyList5 消息处理程序
    
    
    
    
    #pragma once
    
    
    // CMyList5
    
    class CMyList5 : public CListCtrl
    {
        DECLARE_DYNAMIC(CMyList5)
    
    public:
        CMyList5();
        virtual ~CMyList5();
    
        //能够动态的添加多列
        void AddColumn(DWORD dwCount, ...)
        {
            va_list vl;
            va_start(vl, dwCount);
            //名称
            TCHAR* pName = va_arg(vl, TCHAR*);
            InsertColumn(0, pName, 0, 380);
            //发布者
            pName = va_arg(vl, TCHAR*);
            InsertColumn(1, pName, 0, 200);
            //安装时间
            pName = va_arg(vl, TCHAR*);
            InsertColumn(2, pName, 0, 100);
            //版本
            pName = va_arg(vl, TCHAR*);
            InsertColumn(3, pName, 0, 150);
            va_end(vl);
        }
        //能够动态添加一整行的内容
        void AddItem(int n, DWORD dwCount, ...)
        {
            va_list vl;
            va_start(vl, dwCount);
            TCHAR* pName = va_arg(vl, TCHAR*);
            InsertItem(n, pName);
            for (DWORD i = 1; i < dwCount; i++)
            {
                TCHAR* pName = va_arg(vl, TCHAR*);
                SetItemText(n, i, pName);
            }
            va_end(vl);
        }
    
    
    protected:
        DECLARE_MESSAGE_MAP()
    };
  • 相关阅读:
    adb monkey测试 命令
    大数据 入门
    代码设计模式 编写思想 架构
    汉化 android studio
    电脑时间显示秒 win10电脑显示农历
    Restful api介绍
    Map工具系列-03-代码生成BySQl工具使用说明
    win10 office2013激活工具
    win10 1607 密匙
    .net社区
  • 原文地址:https://www.cnblogs.com/yifi/p/6527952.html
Copyright © 2011-2022 走看看