Как программно назначить прокси сервер для браузера

proxy webbrowser
В этой короткой заметке приводится рабочий код на Delphi, позволяющий программно изменить системные интернет настройки и назначить или отменить прокси сервер, через который ваш браузер выходит в интернет. 
Сами настройки прокси сервера можно изменить и вручную, вызвав системный диалог Internet Options:
В результате любой браузер, будь то Internet Explorer или, например, Google Chrome, будут использовать установленный вами прокси-сервер.
Чтобы сделать то же самое программно, можно использовать код, приведенный ниже. Этот код был взят из исходников EmbeddedWB и немного доработан. Думаю, кому то он будет полезен в виде отдельной функции.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
uses WinInet;
function SetSystemProxy(host: string; port: string): boolean;
  const

    INTERNET_PER_CONN_FLAGS = 1;
    PROXY_TYPE_PROXY = $00000002;
    INTERNET_PER_CONN_PROXY_BYPASS = 3;
    INTERNET_PER_CONN_PROXY_SERVER = 2;
    INTERNET_OPTION_PER_CONNECTION_OPTION = 75;
    PROXY_TYPE_DIRECT = $00000001;

  type

    INTERNET_PER_CONN_OPTION = record
      dwOption: DWORD;
      Value: record
        case Integer of
          1: (dwValue: DWORD);
          2: (pszValue: PChar); {Unicode/ANSI}
          3: (ftValue: TFileTime);
      end;
    end;

    LPINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION;
    INTERNET_PER_CONN_OPTION_List = record
      dwSize: DWORD;
      pszConnection: LPTSTR;
      dwOptionCount: DWORD;
      dwOptionError: DWORD;
      intOptions: LPINTERNET_PER_CONN_OPTION;
    end;
    LPINTERNET_PER_CONN_OPTION_List = ^INTERNET_PER_CONN_OPTION_List;

  var list: INTERNET_PER_CONN_OPTION_LIST;
      dwBufSize: DWORD;
      hInternet: Pointer;
      Options: array[1..3] of INTERNET_PER_CONN_OPTION;

begin
  Result := False;
  dwBufSize := SizeOf(list);
  list.dwSize := SizeOf(list);
  list.pszConnection := nil;
  list.dwOptionCount := High(Options);

  Options[1].dwOption := INTERNET_PER_CONN_FLAGS;

  Options[2].dwOption := INTERNET_PER_CONN_PROXY_SERVER;
  if (host='') or (port='') then
  begin
    Options[1].Value.dwValue := PROXY_TYPE_DIRECT;
    Options[2].Value.pszValue := PChar('');
  end else
  begin
    Options[1].Value.dwValue := PROXY_TYPE_PROXY;
    Options[2].Value.pszValue := PChar(host+':'+port);
  end;

  Options[3].dwOption := INTERNET_PER_CONN_PROXY_BYPASS;
  Options[3].Value.pszValue := PChar('');

  list.intOptions := @Options;
  hInternet := InternetOpen(PChar(''), INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  if hInternet <> nil then
  try
    Result := InternetSetOption(nil, INTERNET_OPTION_PER_CONNECTION_OPTION, @list, dwBufSize);
    Result := Result and InternetSetOption(nil, INTERNET_OPTION_REFRESH, nil, 0);
  finally
    InternetCloseHandle(hInternet)
  end;
end;
В качестве параметров в функцию SetSystemProxy передается IP адрес прокси сервера и порт. Чтобы отменить действие прокси необходимо вызвать функцию с пустыми аргументами.

Related Post

Indy TIdHTTP.GET и русские символы в HTML... Решив проблемы с кодиро&...
Indy Cookie Manager своими руками и Livejournal... Продолжая работать с Livejournal&nbs...
Закрытие формы по ESC Здесь будет короткая заметка на общеизвестную тему. Как в Delphi закрыть модальную форму, нажав клавишу Esc. Я хочу напомнить самый правильный и прост...

One thought on “Как программно назначить прокси сервер для браузера

  1. А если прокси требует логин и пароль? как это прикрутить к данной функции?

Leave a Reply

Your email address will not be published. Required fields are marked *