<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-88  評論-77  文章-48  trackbacks-0

    Introduction

    Changing proxy settings of IE is a frequent requirement of mine. Then I got the idea of writing a tool by myself, at last. I have not found clear instructions on this. Many articles recommend to modify registry directly, but unfortunately their instruction is not enough. Most of them direct me to modify the following values in registry :-

    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
    "ProxyEnable"=dword:00000001
    "ProxyServer"=":"
    "ProxyOverride"=""
    "DisablePasswordCaching"=dword:00000001
    

    Details

    I tested it and find that it does not work at least on my computer.( I access internet by ADSL connection.) So I backed up registry and modified proxy settings via Internet Explorer, finding that [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections] is also changed. So I wrote the following code snippet to change proxy settings:

    Collapse
    				void ShowError(long lerr)
    {
        LPVOID lpMsgBuf;
        if (!FormatMessage( 
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM | 
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            lerr,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
            (LPTSTR) &lpMsgBuf,
            0,
            NULL ))
        {
            return;
        }
        MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
        LocalFree( lpMsgBuf );
    }
    void CieproxyDlg::OnBnClickedOk()
    {//set proxy server
        UpdateData();
        GetDlgItemText(IDC_EDIT1,m_sIEProxy);
        HKEY hk;
        LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER,
            "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
            NULL,KEY_WRITE|KEY_SET_VALUE,&hk);
        if(lret==ERROR_SUCCESS&&NULL!=hk)
        {
            TCHAR* pbuf=m_sIEProxy.GetBuffer(1);
            lret=RegSetValueEx( hk,"ProxyServer",NULL,REG_SZ,pbuf,m_sIEProxy.GetLength());
            DWORD dwenable=1;
            lret=RegSetValueEx(hk,"ProxyEnable",NULL,REG_DWORD,
               (LPBYTE)&dwenable,sizeof(dwenable));
            RegCloseKey(hk);
        }
        const TCHAR* keyname3=_T(
          "software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections");
        lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3,NULL,
            KEY_READ|KEY_WRITE|KEY_SET_VALUE,&hk);
        if(lret==ERROR_SUCCESS&&NULL!=hk)
        {
            DWORD dwtype;
            char pbuf[256];
            DWORD dwlen=sizeof(pbuf);
            constchar* valname="Connection to adsl3";
            lret=RegQueryValueEx(hk,valname,NULL,&dwtype,pbuf,&dwlen);
            if(lret!=ERROR_SUCCESS)
            {
                ShowError(lret);
            }
            pbuf[8] = 3;//enable proxy
            pbuf[4]=pbuf[4]+1;
            constchar* p=m_sIEProxy.GetBuffer(1);
            memcpy(pbuf+16,p,m_sIEProxy.GetLength());
            char c=0;
            for(int i=m_sIEProxy.GetLength();i<20;i++)
                pbuf[16+i]=c;
            m_sIEProxy.ReleaseBuffer();
            lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen);
            RegCloseKey(hk);
        }
        DWORD dwret;
        SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL,
            SMTO_NORMAL,1000,&dwret);
    }
    
    void CieproxyDlg::OnBnClickedDisableProxy()
    {
        UpdateData();
        GetDlgItemText(IDC_EDIT1,m_sIEProxy);
        HKEY hk;
        LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER,
            "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
            NULL,KEY_WRITE|KEY_SET_VALUE,&hk);
        if(lret==ERROR_SUCCESS&&NULL!=hk)
        {
            DWORD dwenable=0;
            lret=RegSetValueEx(hk,"ProxyEnable",NULL,REG_DWORD,
                (LPBYTE)&dwenable,sizeof(dwenable));
            RegCloseKey(hk);
        }
        const TCHAR* keyname3=_T(
          "software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections");
        lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3,
            NULL,KEY_READ|KEY_WRITE|KEY_SET_VALUE,&hk);
        if(lret==ERROR_SUCCESS&&NULL!=hk)
        {
            DWORD dwtype;
            char pbuf[256];
            DWORD dwlen=sizeof(pbuf);
            constchar* valname="Connection to adsl3";
            lret=RegQueryValueEx(hk,valname,NULL,&dwtype,pbuf,&dwlen);
            if(lret!=ERROR_SUCCESS)
            {
                ShowError(lret);
            }
            pbuf[8] = 1;//enable proxy
            pbuf[4]=pbuf[4]+1;
            lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen);
            RegCloseKey(hk);
        }
        DWORD dwret;
        SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL,SMTO_NORMAL,
            1000,&dwret);
    }

    Problem with above code is that existing Internet Explorer instances don't know the change of settings. What is more, changing registry directly is not an elegant method. Then the following must be more attractive :

    Collapse
    BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr)
    {
        //conn_name: active connection name. //proxy_full_addr : eg "210.78.22.87:8000"
        INTERNET_PER_CONN_OPTION_LIST list;
        BOOL    bReturn;
        DWORD   dwBufSize = sizeof(list);
        // Fill out list struct.
        list.dwSize = sizeof(list);
        // NULL == LAN, otherwise connectoid name.
        list.pszConnection = conn_name;
        // Set three options.
        list.dwOptionCount = 3;
        list.pOptions = new INTERNET_PER_CONN_OPTION[3];
        // Make sure the memory was allocated.if(NULL == list.pOptions)
        {
            // Return FALSE if the memory wasn't allocated.
            OutputDebugString("failed to allocat memory in SetConnectionOptions()");
            return FALSE;
        }
        // Set flags.
        list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
        list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT |
            PROXY_TYPE_PROXY;
    
        // Set proxy name.
        list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
        list.pOptions[1].Value.pszValue = proxy_full_addr;//"http://proxy:80";// Set proxy override.
        list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
        list.pOptions[2].Value.pszValue = "local";
    
        // Set the options on the connection.
        bReturn = InternetSetOption(NULL,
            INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
    
        // Free the allocated memory.delete [] list.pOptions;
        InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
        InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
        return bReturn;
    }
    BOOL DisableConnectionProxy(LPCTSTR conn_name)
    {
        //conn_name: active connection name. 
        INTERNET_PER_CONN_OPTION_LIST list;
        BOOL    bReturn;
        DWORD   dwBufSize = sizeof(list);
        // Fill out list struct.
        list.dwSize = sizeof(list);
        // NULL == LAN, otherwise connectoid name.
        list.pszConnection = conn_name;
        // Set three options.
        list.dwOptionCount = 1;
        list.pOptions = new INTERNET_PER_CONN_OPTION[list.dwOptionCount];
        // Make sure the memory was allocated.if(NULL == list.pOptions)
        {
            // Return FALSE if the memory wasn't allocated.
            OutputDebugString("failed to allocat memory in DisableConnectionProxy()");
            return FALSE;
        }
        // Set flags.
        list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
        list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT  ;
        // Set the options on the connection.
        bReturn = InternetSetOption(NULL,
            INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
        // Free the allocated memory.delete [] list.pOptions;
        InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
        InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
        return bReturn;
    }

    The usage is very straightforward:

    				//set proxy
    				const
    				char* connection_name="Connection to adsl3";
        SetConnectionOptions(connection_name,"62.81.236.23:80");
    //disable proxy 
        DisableConnectionProxy(connection_name);
        

    Existing Internet Explorer instances are notified by INTERNET_OPTION_SETTINGS_CHANGED and INTERNET_OPTION_REFRESH

    posted on 2007-01-25 20:13 崛起的程序員 閱讀(887) 評論(0)  編輯  收藏 所屬分類: 載選文章
    主站蜘蛛池模板: 亚洲av日韩专区在线观看| 四只虎免费永久观看| 久99久无码精品视频免费播放| 亚洲精品成人久久| jlzzjlzz亚洲乱熟在线播放| 免费A级毛片无码免费视| 99久久人妻精品免费一区| 美女被免费网站91色| 香港经典a毛片免费观看看| 国产精品高清视亚洲一区二区| 水蜜桃亚洲一二三四在线| 超清首页国产亚洲丝袜| 免费真实播放国产乱子伦| 日韩在线天堂免费观看| 国产人在线成免费视频| 最近免费中文字幕mv在线电影| 可以免费观看的国产视频| 巨胸狂喷奶水视频www网站免费| 美女扒开屁股让男人桶爽免费| 亚洲欧美成人综合久久久| 亚洲三级高清免费| 亚洲AV无码国产精品色| 中文字幕亚洲综合精品一区| 久久久久久a亚洲欧洲aⅴ| 亚洲线精品一区二区三区影音先锋| 亚洲高清最新av网站| 亚洲国产成人久久综合野外| 亚洲av无码成人精品区在线播放| 国产又粗又长又硬免费视频| 国产免费怕怕免费视频观看| 国产又大又粗又硬又长免费 | 国产国拍亚洲精品mv在线观看| 国产精品亚洲玖玖玖在线观看 | v片免费在线观看| 全部一级一级毛片免费看| 一级一级一片免费高清| jizz免费观看| A级毛片高清免费视频在线播放| 日本免费一区二区久久人人澡 | 久久亚洲成a人片| 亚洲系列中文字幕|