using System; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Management; using System.Threading; using System.Security.Permissions; using System.Security; using System.ComponentModel; using mshtml; using System.Reflection; namespace SuperMap.RealEstate.SecurityDevice { [SecuritySafeCritical] [DefaultEvent("DeviceStateChanged")] public partial class SecurityDeviceControl : UserControl { IClientSecurityDevice _SecurityDevice = new UsbKeyLicenseDevice(); public SecurityDeviceControl() { try { InitializeComponent(); //注册消息 _SecurityDevice.MessageChanged += new ClientSecurityDeviceMessageHandler(SecurityDeviceControl_MessageChanged); } catch (Exception ex) { MessageBox.Show(ex.Message); } } /// /// 设备初始化,并连接设备。 /// /// 是否找到设备 public bool Device_Connect() { bool _result = false; try { SetValue(null); _result=Device_Read(); RegisterNotification(); return _result; } catch (Exception ex) { MessageBox.Show(ex.Message); return false; } } public event ClientSecurityDeviceStateHandler DeviceStateChanged; protected virtual void OnDeviceStateChanged(ClientSecurityDeviceEventArgs e) { if (DeviceStateChanged != null) { DeviceStateChanged(this, e); } } /// /// 用户授权时间 /// public string User_Expiry { get { if (string.IsNullOrEmpty(textBoxDate.Text)) return DateTime.Now.AddYears(1).ToString("yyyy-MM-dd HH:mm:ss"); else { DateTime _DateTime=new DateTime(); if (DateTime.TryParse(textBoxDate.Text, out _DateTime)) return DateTime.Parse(textBoxDate.Text).ToString("yyyy-MM-dd HH:mm:ss"); else return DateTime.Now.AddYears(1).ToString("yyyy-MM-dd HH:mm:ss"); } } } public string Message { get { return _SecurityDevice.Message; } set { _SecurityDevice.Message = value; OnDeviceMessageChanged(new ClientSecurityDeviceMessageEventArgs(value)); } } private void OnDeviceMessageChanged(ClientSecurityDeviceMessageEventArgs e) { if (DeviceMessageChanged != null) { DeviceMessageChanged(this, e); } } public event ClientSecurityDeviceMessageHandler DeviceMessageChanged ; void SecurityDeviceControl_MessageChanged(object sender, ClientSecurityDeviceMessageEventArgs e) { if (DesignMode) return; OnDeviceMessageChanged(e); } public void SetValue(ClientSecurityDeviceObject value) { if (DesignMode) return; textBoxName.Text = (value==null) ?"": value.Name; textBoxUser.Text = (value == null) ? "" : value.User; textBoxKey.Text = (value == null) ? "" : value.Key; textBoxDate.Text = (value == null) ? "" : value.Date; textBoxUrl.Text = (value == null) ? "" : value.Url; //_DeviceKey = (value == null) ? "" : (value.Name + "|" + value.User + "|" + value.Key + "|" + value.Date + "|" + value.Url); } private ClientSecurityDeviceObject GetValue() { if (DesignMode) return null; ClientSecurityDeviceObject _SecurityDeviceInfo = new ClientSecurityDeviceObject(); _SecurityDeviceInfo.Name = textBoxName.Text; _SecurityDeviceInfo.User = textBoxUser.Text; _SecurityDeviceInfo.Key = textBoxKey.Text; _SecurityDeviceInfo.Date = textBoxDate.Text; _SecurityDeviceInfo.Url = textBoxUrl.Text; return _SecurityDeviceInfo; } //string _DeviceKey = string.Empty; //public string DeviceKey //{ // get // { // return _DeviceKey; // } //} #region WndProc /// /// /// /// 要处理的 WindowsSystem.Windows.Forms.Message。 protected override void WndProc(ref Message m) { switch (m.Msg) { case SecurityDeviceHelper.WM_DEVICECHANGE: ListenerNotification(ref m); break; } base.WndProc(ref m); } #endregion #region ListenerNotification /// /// 侦听设备通知 /// /// 消息 private void ListenerNotification(ref Message msg) { int wParam = (int)msg.WParam; if (wParam == SecurityDeviceHelper.DBT_DEVICEARRIVAL) { int devType = Marshal.ReadInt32(msg.LParam, 4); if (devType == SecurityDeviceHelper.DBT_DEVTYP_DEVICEINTERFACE) { Device_Read(); } } if (wParam ==SecurityDeviceHelper.DBT_DEVICEREMOVECOMPLETE) { Device_Remove(); } } #endregion #region Device_Read public bool Device_Read() { ClientSecurityDeviceObject _SecurityDeviceInfo; if (_SecurityDevice.Open()) { if (_SecurityDevice.Read(out _SecurityDeviceInfo)) { SetValue(_SecurityDeviceInfo); OnDeviceStateChanged(new ClientSecurityDeviceEventArgs(_SecurityDeviceInfo, ClientSecurityDeviceState.Insert)); } _SecurityDevice.Close(); return true; } else { return false; } } #endregion #region Device_Remove private void Device_Remove() { //Message = "数字证书被拔出。"; OnDeviceMessageChanged(new ClientSecurityDeviceMessageEventArgs("数字证书被拔出")); ClientSecurityDeviceObject _SecurityDeviceInfo = GetValue(); OnDeviceStateChanged(new ClientSecurityDeviceEventArgs(_SecurityDeviceInfo, ClientSecurityDeviceState.Remove)); SetValue(null); } #endregion #region RegisterNotification /// /// 注册设备通知 /// void RegisterNotification() { SecurityDeviceHelper.DEV_BROADCAST_DEVICEINTERFACE dbi = new SecurityDeviceHelper.DEV_BROADCAST_DEVICEINTERFACE(); int size = Marshal.SizeOf(dbi); dbi.dbcc_size = size; dbi.dbcc_devicetype = SecurityDeviceHelper.DBT_DEVTYP_DEVICEINTERFACE; dbi.dbcc_reserved = 0; dbi.dbcc_classguid = SecurityDeviceHelper.GUID_DEVINTERFACE_USB_DEVICE; dbi.dbcc_name = 0; IntPtr buffer = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(dbi, buffer, true); if (SecurityDeviceHelper.RegisterDeviceNotification(Handle, buffer, SecurityDeviceHelper.DEVICE_NOTIFY_WINDOW_HANDLE) == IntPtr.Zero) { MessageBox.Show(SecurityDeviceHelper.GetLastError().ToString()); } } #endregion } }