1

オンラインにするために、wininet.dll で次の関数を呼び出しています (C# pinvoke):

[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int InternetDial(IntPtr hWndParent, string pszEntryName,
                                   int dwFlags, ref int lpdwConnection,
                                   int ReservedValue);

 public static bool GetOnline()
 {
        int connectionID = 0;
        InternetDial(IntPtr.Zero, "DefaultDialUp", INTERNET_AUTODIAL_FORCE_UNATTENDED, ref connectionID, 0);
        return (connectionID != 0);
 }

問題は、ハードウェア障害などのダイヤルアップ プロセスでエラーが発生した場合です
。Windows は、ユーザーに処理方法を尋ねるブロック ダイアログを表示します。
ユーザーがダイアログを閉じるまで機能が停止します。
ここに画像の説明を入力 このコードを展開する必要があります。自動システムでは、これは私にとって大きな問題です...

Windows APIレベルでエラーダイアログを抑制する方法を探しています..

前もってありがとう、エイタン。

4

1 に答える 1

0

私は問題の回避策を見つけることができましたが、それはかなり厄介で、
より良い解決策がまだ歓迎されています...

    const int WM_CLOSE = 0x10;
    const int INTERNET_AUTODIAL_FORCE_UNATTENDED = 0x2;

    [DllImport("User32.dll", EntryPoint = "PostMessage")]
    public static extern int PostMessage(int hWnd, int Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern int InternetDial(IntPtr hWndParent, string pszEntryName, int dwFlags, ref int lpdwConnection, int ReservedValue);

        public static bool GetOnline()
        {
            connectionID = 0;
            Form f = null;
            var t = new Thread((ParameterizedThreadStart)delegate
            {
                f = new Form();                
                InternetDial(f.Handle, "DefaultDialUp", INTERNET_AUTODIAL_FORCE_UNATTENDED, ref connectionID, 0);
            });
            t.Start();
            t.Join(23000); //wait 23 seconds before closing the window
            f.Invoke((EventHandler)delegate {
                PostMessage(f.Handle.ToInt32(), WM_CLOSE, IntPtr.Zero, IntPtr.Zero);            
            });
            t.Join();            
            return (connectionID != 0);            
        }
于 2012-11-28T12:24:03.907 に答える