一、注册表方式
BOOL GetProxyServer(OUT LPSTR lpHostName_, OUT int& nport_)
{
DWORD _dwProxyEnable = 0;
QKPlugin_GetRegistryDw(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"), _T("ProxyEnable"), _dwProxyEnable);
if (!_dwProxyEnable)
return FALSE;
CString _strProxyServer = QKPlugin_GetRegistryStr(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"), _T("ProxyServer"));
_strProxyServer.MakeLower();
int _nhttpleng = -1;
_nhttpleng = _strProxyServer.Find(_T("http="));
// 格式解析 ftp=127.0.0.1:10001;gopher=127.0.0.1:10001;http=127.0.0.1:10001;https=127.0.0.1:10001;socks=127.0.0.1:10002;lq=1
if (_nhttpleng != -1)
{
_strProxyServer = _strProxyServer.Right(_strProxyServer.GetLength() - _nhttpleng - strlen("http="));
if (_strProxyServer.Find(_T(";")) != -1)
_strProxyServer = _strProxyServer.Left(_strProxyServer.Find(_T(";")));
int _x1 = 0, _x2 = 0, _x3 = 0, _x4 = 0, _port = 0;
swscanf(_strProxyServer, _T("%d.%d.%d.%d:%d"), &_x1, &_x2, &_x3, &_x4, &_port);
CHAR _szHostname[100] = { NULL };
sprintf(_szHostname, "%d.%d.%d.%d", _x1, _x2, _x3, _x4);
nport_ = _port;
strcpy_s(lpHostName_, 100, _szHostname);
if (_port != 0)
return TRUE;
}
// 格式解析 127.0.0.1:10001 或者dlsh.cooc:80
int _port = 0;
CString _strHostname;
int _nColon = _strProxyServer.Find(_T(":"));
if (_nColon == -1)
return FALSE;
_strHostname = _strProxyServer.Left(_nColon);
_port = _ttoi(_strProxyServer.Right(_strProxyServer.GetLength()-_nColon-1));
nport_ = _port;
int _ntemp=100;
UnicodeToMbcs(_strHostname.GetBuffer(), lpHostName_, _ntemp);
if (_port == 0)
return FALSE;
return TRUE;
}
二、API
#include"wininet.h"
#pragma comment(lib, "Wininet.lib")
BOOL GetWinetProxy(LPSTR lpszProxy, UINT nProxyLen)
{
unsigned long nSize = 4096;
char szBuf[4096] = { 0 };
INTERNET_PROXY_INFO* pProxyInfo = (INTERNET_PROXY_INFO*)szBuf;
if (!InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pProxyInfo, &nSize))
{
return FALSE;
}
if (pProxyInfo->dwAccessType == INTERNET_OPEN_TYPE_DIRECT)
{
return FALSE;
}
//这里是代理列表,以\0分隔,结束处两个\0\0,一般我们取第一条代理就够了
LPCSTR lpszProxyList = (LPCSTR)(pProxyInfo + 1);
int nLen = strlen(lpszProxyList);
if (lpszProxy)
{
nProxyLen = min(nLen, nProxyLen - 1);
strncpy_s(lpszProxy, nProxyLen+1,lpszProxyList, nLen);
lpszProxy[nProxyLen] = 0;
}
return nLen;
/* // 方法2
INTERNET_PER_CONN_OPTION_LISTA List;
INTERNET_PER_CONN_OPTIONA Option[1];
unsigned long nSize = sizeof(INTERNET_PER_CONN_OPTION_LISTA);
Option[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 1;
List.dwOptionError = 0;
List.pOptions = Option;
if(!InternetQueryOptionA(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, &nSize))
{
return FALSE;
}
if(Option[0].Value.pszValue != NULL)
{
int nLen = strlen(Option[0].Value.pszValue);
if (lpszProxy)
{
nProxyLen = min(nLen, nProxyLen-1);
strncpy_s(lpszProxy,nProxyLen+1, Option[0].Value.pszValue, nProxyLen);
lpszProxy[nProxyLen] = 0;
}
GlobalFree(Option[0].Value.pszValue);
return nLen;
}
*/
return FALSE;
}