4

アクティブなネットワーク接続に基づいてプロキシサーバーを自動的に変更するアプリケーションを作成しようとしています。このアプリケーションでは、ユーザーはnotifyIconコンテキストメニューでサーバーを手動でクリックし、関数を呼び出してサーバーを切り替えることもできます。

私の問題は次のとおりです。アプリケーションは、関数が最初に呼び出されたときにプロキシサーバーを変更しますが、それ以降は機能しません。正しいプロキシサーバーがその関数に渡されていることを確認するためにデバッグステートメントを挿入しましたが(実際に正しい)、レジストリエントリは最初から変更されることはありません。私は何が間違っているのですか?

これが私のプロキシクラスです:

class Proxy
{
    [DllImport("wininet.dll")]
    public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
    public const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
    public const int INTERNET_OPTION_REFRESH = 37;
    static bool settingsReturn, refreshReturn;

    public void SetProxy(ProxyList proxy)
    {
        RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
        registry.SetValue("ProxyEnable", 1);
        registry.SetValue("ProxyServer", proxy.server + ":" + proxy.port);
        registry.Close();

        // These lines implement the Interface in the beginning of program 
        // They cause the OS to refresh the settings, causing IP to realy update
        settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
        refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
    }


}

そして、コンテキストメニューから関数を呼び出す方法は次のとおりです。

void Form1_Click(object sender, EventArgs e)
    {
        Proxy proxyServer = new Proxy();
        ToolStripMenuItem item = (ToolStripMenuItem)sender;
        proxyServer.SetProxy(XML.proxy[(int)item.Tag]);
        proxyServer = null;
        notifyIcon1.BalloonTipText = XML.proxy[(int)item.Tag].name + " is now your Active Proxy";
        notifyIcon1.ShowBalloonTip(1);
    }
4

3 に答える 3

1

Microsoftのナレッジベースから:InternetExplorerでプログラムでプロキシ設定を照会および設定する方法

INTERNET_OPTION_PER_CONNECTION_OPTIONを使用すると、NULLハンドルが使用されている場合、システム全体で設定が変更されます。グローバルプロキシ設定を正しく反映するには、INTERNET_OPTION_REFRESHオプションフラグを指定してInternetSetOption関数を呼び出す必要があります。

これはMSDNからのものです

INTERNET_OPTION_PER_CONNECTION_OPTION75 特定の接続のオプションのリストを指定するINTERNET_PER_CONN_OPTION_LIST構造を設定または取得します

これは、InternetQueryOptionおよびInternetSetOptionによって使用されます。このオプションは、InternetExplorer5以降でのみ有効です。

INTERNET_PER_CONN_OPTION_LIST構造について読んでください。

注:INTERNET_PER_CONN_PROXY_SERVERフラグの値は2です。

于 2010-01-13T18:48:23.820 に答える
0

RegistryKeyクラスは使い捨てです。キャッシュされているか何かである可能性があります。閉じるだけでなく、破棄してみてください。

于 2010-01-13T18:49:14.350 に答える
-1

レジストリを直接変更するのではなく、ブラウザ用のプラグインを使用する方がよいと思います。

于 2010-01-13T18:46:37.460 に答える