アクティブなネットワーク接続に基づいてプロキシサーバーを自動的に変更するアプリケーションを作成しようとしています。このアプリケーションでは、ユーザーは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);
}