2010-01-13 3 views
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); 
    } 
+0

기존 프록시 서버에 대한 연결이 열려있는 응용 프로그램이 자동으로 새 프록시에 연결되거나 새 프록시가 프록시 변경을받지 않을 것으로 예상됩니까? –

답변

1

: How to programmatically query and set proxy settings under Internet Explorer

참고 INTERNET_OPTION_PER_CONNECTION_OPTION는 NULL 핸들을 사용할 때 설정이 시스템 전체를 기반으로 변경됩니다. 전역 프록시 설정을 올바르게 반영하려면 INTERNET_OPTION_REFRESH 옵션 플래그가있는 InternetSetOption 함수를 호출해야합니다.


75
세트 MSDN

INTERNET_OPTION_PER_CONNECTION_OPTION에서 또는 특정 연결 옵션의 목록을 지정하는 INTERNET_PER_CONN_OPTION_LIST 구조를 검색한다. 이것은 InternetQueryOption 및 InternetSetOption에서 사용됩니다. 이 옵션은 Internet Explorer 5 이상에서만 유효합니다.

Read about the INTERNET_PER_CONN_OPTION_LIST structure.

참고 : INTERNET_PER_CONN_PROXY_SERVER 플래그의 값은 2

+0

친절하고 상세한 답변. –

+0

감사합니다. 플래그 값을 추가하면 Windows API에 대한 빠른 참조가없는 C# 프로그래머에게 도움이 될 것이며 MSDN에서는 정의되지 않았습니다. 나는 내가 대학에있을 때 그렇게 할 수있는 프로그램을 만드는 것에 대해 생각해 봤으면 좋겠다. 수동으로 3 개의 다른 프록시 사이를 전환해야했습니다. – Wolf

+0

나는 해결책이 무엇이라고 말하고 있는지 이해하지 못한다. NULL 핸들, INTERNET_OPTION_PER_CONNECTION_OPTION 및 빈 INTERNET_PER_CONN_OPTION_LIST를 사용하여'InternetSetOption()'을 호출 하시겠습니까? –

-1

난 당신이 더 나은 플러그인을 할 거라고 생각을 당신의 브라우저를 직접 레지스트리를 변경하는 대신. 마이크로 소프트의 기술 자료에서

+0

전자 메일 클라이언트와 같은 브라우저가 아닌 응용 프로그램은 어떻습니까? –

0

RegistryKey 클래스는 일회용입니다. 어쩌면 캐시 된 것이거나 그것을 닫는 것 외에도 처리를 시도하십시오.

관련 문제