我正在嘗試編寫一個基於網絡連接處於活動狀態的應用程序,該應用程序會自動更改代理服務器。在這個應用程序中,用戶也可以手動點擊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);
}
您是否期待與現有代理服務器建立開放連接以自動連接到新代理的應用程序,還是新的進程沒有啓動代理更改? –