.NET CompactFramework3.5アプリケーションにWindowsMobile接続マネージャーのサポートを追加しています。
ユーザーから接続エラーを隠す必要があります。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とその設定にアクセスできます。
誰かが私が間違っていることを見ることができますか?