質問: 初めまして。akaiと申します。 ### 1.行っている事 Windows10で、コマンドラインでレジストリを変更することでプロキシを設定しています。 具体的には、下記のレジストリキーにプロキシサーバーを設定し、 ``` Key: HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer Type: REG_SZ Value: socks=localhost:10900 ``` さらに下記のレジストリキーを変更することで、プロキシの有効|無効を切り替えております。 ``` Key: HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable Type: REG_DWORD Value: 1(Enable) | 0(Disable) ``` 設定が適用されたかどうか(=接続がプロキシ経由に変更されたかどうか)は、https://whatismyipaddress.com/に接続することで確認しています。 ### 2.発生している問題 問題は、上記1.に書きました方法では、設定がすぐには適用されない事です GUIでプロキシサーバーの設定を変更した場合は、ダイアログボックスのOKボタンを押下すれば、すぐに適用され、プロキシ経由の接続となります。 しかし、上記1.に書きました方法でレジストリからプロキシをEnableにしても、そのままではプロキシ経由の接続に変更されず、プロキシ設定前の接続で接続できる状態が継続し、この時ブラウザを再起動しても変更されず、次のいずれかの操作を行ってはじめて、プロキシ経由の接続に変更されます。 * インターネット接続を一旦切断し、再接続する * 「ネットワークのトラブルシューティングツール」を実行し、「問題を検出しています」の画面が完了し、「~いくつかのWebサイトにアクセスできることが確認されました」と表示(つまり何も修復や設定変更は行われていないはず)されたとき ### 3.実現したい事、教えて頂きたい事 コマンドラインで行ったプロキシの設定をすぐに反映させたいのですが、 上記1.のレジストリの変更の後に、足りない操作は何でしょうか? 上記1.のレジストリの変更により、GUIの操作で変更される項目は全て変更できているはずだと思うのですが、なぜ再接続などをしないと、反映されないのでしょうか? WindowsのダイアログボックスのOKボタンを押下するときに、何かコマンドが実行されるのでしょうか? (と思い、Win32 APIタグをこの質問に付けました。) どうぞよろしくお願いいたします。
回答: `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings` のレジストリについて、もともとそのレジストリ設定はInternet Explorerとその関連するコンポーネントでWindows内において共通で使われているもので、設定の内容はマイクロソフトが公式に公開しているものではなく、レジストリ設定をハック(<悪い意味ではありません)されたものが長い間に周知されたものでしかありません。もしかしたらレジストリの詳細内容は今や公式に案内されている部分もあるかもしれませんが、全体の動きとしては未サポートのはずです。特に、Microsoft Edgeが公式のブラウザーになってからは、使っていなかった設定データだと思います。 ではユーザーがその設定を手動で変えた場合に、いつ反映するかというとそれも非公式なもので、確実なのはユーザーがいったんログオフ(サインアウト)して再度ログオン(サインイン)したときにユーザープロファイルが再読み込みされたときと、質問者さんが既にご指摘の部分、「WindowsのダイアログボックスのOKボタンを押下するとき」です。OKボタンを押すと効くのは、その設定データを扱うアプリケーションそのものだからです。ブラウザーを再起動しても効かない場合があるのは、ブラウザーは単なるUIを持つ外側のアプリケーションであり、設定を取り扱うコアとなるプログラムは別にあり、それがWindows全体のインターネット接続設定を取り扱っている為です。ですので、ユーザーが手動でレジストリ設定を変更したときに即、設定を反映させるのは難しいかと思います。 まぁ、あと簡単に考えられるのは「インターネットのプロパティ」設定画面は以下のコマンドラインで開くので、「ローカルエリアネットワーク(LAN)の設定」画面で[OK]ボタンをプログラムで押せるよう、がんばってボタン押下をシミュレートする、でしょうか。 ``` C:>C:\Windows\System32\rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl ``` ちなみにソフトウェアによっては`WinHTTP`と言う別のインターネット関連技術(と設定項目)を使います。