1

.NET CompactFramework3.5アプリケーションにWindowsMo​​bile接続マネージャーのサポートを追加しています。

ユーザーから接続エラーを隠す必要があります。MSDNのドキュメントを読み、それに従って文字を書きましたが(私が知る限り)、GPRSが接続に失敗した場合でもポップアップが表示され続けます。

これが私のC#コードです:

これは、ConnMgrConnectionInfo構造のマネージラッパーです。

[StructLayout(LayoutKind.Sequential)]
public sealed class ConnMgrConnectionInfo
{
    Int32 cbSize;                           // DWORD
    public ConnMgrParam dwParams = 0;       // DWORD
    public ConnMgrProxy dwFlags = 0;        // DWORD
    public ConnMgrPriority dwPriority = 0;  // DWORD
    public Int32 bExclusive = 0;            // BOOL
    public Int32 bDisabled = 0;             // BOOL
    public Guid guidDestNet = Guid.Empty;   // GUID
    public IntPtr hWnd = IntPtr.Zero;       // HWND
    public UInt32 uMsg = 0;                 // UINT
    public Int32 lParam = 0;                // LPARAM
    public UInt32 ulMaxCost = 0;            // ULONG
    public UInt32 ulMinRcvBw = 0;           // ULONG
    public UInt32 ulMaxConnLatency = 0;     // ULONG

    // Constructors
    public ConnMgrConnectionInfo()
    {
        cbSize = Marshal.SizeOf(typeof(ConnMgrConnectionInfo));
    }

    public ConnMgrConnectionInfo(Guid destination, ConnMgrPriority priority,  ConnMgrProxy proxy)
        : this()
    {
        guidDestNet = destination;
        dwParams = ConnMgrParam.GuidDestNet;
        dwPriority = priority;
        dwFlags = proxy;
    }

    public ConnMgrConnectionInfo(Guid destination, ConnMgrPriority priority)
        : this(destination, priority, ConnMgrProxy.NoProxy) { }

    public ConnMgrConnectionInfo(Guid destination)
        : this(destination, ConnMgrPriority.UserInteractive) { }
}

これとともに、connmgr.hからのCフラグを定義する列挙型があります。

[Flags]
public enum ConnMgrParam : int
{
    GuidDestNet = 0x1,
    MaxCost = 0x2,
    MinRcvBw = 0x4,
    MaxConnLatency = 0x8
}

    [Flags]
public enum ConnMgrProxy : int
{
    NoProxy = 0x0,
    Http = 0x1,
    Wap = 0x2,
    Socks4 = 0x4,
    Socks5 = 0x8,
    SuspendAware = 0x10,
    Registered_Home = 0x20,
    No_Error_Msgs = 0x40,
    WakeOnIncoming = 0x80,
}

public enum ConnMgrPriority
{
    UserInteractive = 0x8000,
    HighPriorityBackground = 0x0200,
    LowPriorityBackground = 0x0008
}

接続マネージャで接続を「ダイヤル」するための関連するPInvokeは次のとおりです。

[DllImport("CellCore.dll", EntryPoint = "ConnMgrEstablishConnectionSync", SetLastError = true)]
public static extern int ConnMgrEstablishConnectionSync(ConnMgrConnectionInfo connectionInfo, ref IntPtr connectionHandle, 
    uint dwTimeout, ref ConnMgrStatus dwStatus);

そして最後に、正しい設定でConnMgrConnectionInfoをインスタンス化し、接続マネージャーに接続を要求するコードを次に示します。

const string scDefaultDestinationNetwork = "My ISP";
const uint dwTimeout = 60000;
ConnMgrStatus status = ConnMgrStatus.Unknown;
IntPtr pointerOut = IntPtr.Zero;
int retVal;

if (ConnectionEntry.DestinationNetwork == null)
{
    ConnectionEntry.DestinationNetwork = scDefaultDestinationNetwork;
}

Guid destinationNetworkGuid = LookupGUIDforNetwork(ConnectionEntry.DestinationNetwork);
ConnMgrConnectionInfo info = new ConnMgrConnectionInfo(destinationNetworkGuid, ConnMgrPriority.HighPriorityBackground, ConnMgrProxy.No_Error_Msgs);
retVal = Win32PInvokes.ConnMgrEstablishConnectionSync(info, ref pointerOut, dwTimeout, ref status);
if (retVal == 0)
{
    ConnectionEntry.Handle = pointerOut;
    ConnectionFailures = 0;
}
else
{
    ConnectionFailures++;
}

また、接続の成功と切断メッセージを非表示にするために、次のレジストリ設定が0に設定されています。

HKEY_CURRENT_USER\ControlPanel\Notifications\{8ddf46e7-56ed-4750-9e58-afc6ce486d03}\Options (0)
HKEY_CURRENT_USER\ControlPanel\Notifications\{8ddf46e8-56ed-4750-9e58-afc6ce486d03}\Options (0)

このコードが実行されると、接続エラーがキオスクスタイルのアプリケーションにポップアップ表示され、ユーザーは[設定]をクリックして、基盤となるOSとその設定にアクセスできます。

誰かが私が間違っていることを見ることができますか?

4

1 に答える 1

1

これが私の解決策です:

次のレジストリ設定を独自のカスタム exe に再ポイントします。

HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\Rai\:MSREMNET\1

デフォルトでは、\Windows の RemNet.exe というプログラムになります。

パラメータ -RASERROR を渡すと、バルーンがポップアップします。

-RASERROR で呼び出しを選択的に無視し、残りを元の RemNet に渡す独自の exe を作成しました。

#if DEBUG
            string message = "OurRemNet called with:\r\n";

            foreach (string arg in args)
            {
                message += arg + "\r\n";
            }

            MessageBox.Show(message);

            string repeatparams = "";

            foreach (string arg in args)
            {
                repeatparams += arg + " ";
            }

            Process.Start(@"\Windows\RemNet.exe", repeatparams);
#else
                bool forwardToRemNet = true;

                foreach(string arg in args)
                {
                    if (arg == "-RASERROR")
                    {
                        forwardToRemNet = false;
                    }
                }

                if (forwardToRemNet)
                {
                    string repeatparams = "";

                    foreach (string arg in args)
                    {
                        repeatparams += arg + " ";
                    }
                    Process.Start(@"\Windows\RemNet.exe", repeatparams);
                }
#endif

DEBUG スイッチを使用して、何が起こっているかを通知する EXE をビルドする (DEBUG) か、単に ras エラーをマスクする (RELEASE)

于 2012-05-24T14:37:33.983 に答える