同系列文章:
EZUSB核心源代码出售:
价格:壹仟圆人民币
微信:splashcn
演示程序功能说明:
实现对USB设备的启用和停用
演示程序下载:
<Window x:Class="Splash.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Title="USB开关控制器 By 秦建辉 2017年6月22日" Height="800" Width="1400" WindowStartupLocation="CenterScreen" Icon="usb.ico" FontSize="16" WindowState="Maximized"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> </Grid.RowDefinitions> <GroupBox Grid.Row="0" Margin="3" Header="选择设备"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Label Grid.Row="0" Grid.Column="0" Content="设备VID" Margin="3"/> <Label Grid.Row="1" Grid.Column="0" Content="设备PID" Margin="3"/> <TextBox Grid.Row="0" Grid.Column="1" Name="textBoxVid" Width="100" CharacterCasing="Upper" MaxLength="4" Margin="3" Text="096E" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/> <TextBox Grid.Row="1" Grid.Column="1" Name="textBoxPid" Width="100" CharacterCasing="Upper" MaxLength="4" Margin="3" Text="0305" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/> <Button Grid.Row="0" Grid.RowSpan="2" Grid.Column="2" Name="buttonQuery" Content="检索设备" Width="100" Margin="3" Click="buttonQuery_Click" HorizontalAlignment="Left"/> </Grid> </GroupBox> <Grid Grid.Row="1" Margin="3"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <GroupBox Grid.Column="0" Header="节点列表" Margin="3"> <ScrollViewer> <StackPanel Name="stackPanelMain"/> </ScrollViewer> </GroupBox> <GroupBox Grid.Column="1" Header="子节点列表" Margin="3"> <ScrollViewer> <StackPanel Name="stackPanelSub"/> </ScrollViewer> </GroupBox> </Grid> </Grid> </Window>
MainWindow.xaml.cs
using Com.FirstSolver.Splash; using Com.FirstSolver.USB; using System.Globalization; using System.Windows; namespace Splash { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void buttonQuery_Click(object sender, RoutedEventArgs e) { // 清空现有设备 stackPanelMain.Children.Clear(); // 获取设备Vid ushort Vid; if (string.IsNullOrEmpty(textBoxVid.Text) || !ushort.TryParse(textBoxVid.Text, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out Vid)) { MessageBoxPlus.Show(this, "请输入正确的设备VID!", "错误", MessageBoxButton.OK, MessageBoxImage.Error); textBoxVid.Focus(); return; } // 获取设备Pid ushort Pid; if (string.IsNullOrEmpty(textBoxPid.Text) || !ushort.TryParse(textBoxPid.Text, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out Pid)) { MessageBoxPlus.Show(this, "请输入正确的设备PID!", "错误", MessageBoxButton.OK, MessageBoxImage.Error); textBoxPid.Focus(); return; } // 枚举设备 PnPEntityInfo[] UsbDevices = EZUSB.WhoUsbDevice(Vid, Pid); foreach (PnPEntityInfo Item in UsbDevices) { if (!Item.PNPDeviceID.StartsWith("USB\\")) continue; uint DevNode; if (EZUSB.CM_Locate_DevNode(out DevNode, Item.PNPDeviceID, EZUSB.CM_LOCATE_DEVNODE_NORMAL) == EZUSB.CR_SUCCESS) { stackPanelMain.Children.Add(new UserControlNodeItem(this, stackPanelSub, DevNode, Item.PNPDeviceID, Item.ClassGuid)); } } } } }
UserControlNodeItem.xaml
<UserControl x:Name="userControl" x:Class="Splash.UserControlNodeItem" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="120" d:DesignWidth="400" Margin="3" Padding="3"> <Border BorderThickness="2" BorderBrush="SandyBrown" Padding="3"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Label Grid.Row="0" Grid.Column="0" Content="节点编号:" Margin="3"/> <Label Grid.Row="1" Grid.Column="0" Content="安装类GUID:" Margin="3"/> <Label Grid.Row="2" Grid.Column="0" Content="设备ID:" Margin="3"/> <Grid Grid.Row="0" Grid.Column="1"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBox Name="textBoxDevNode" Grid.Column="0" Margin="3" Width="40" IsReadOnly="True" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/> <Button Name="buttonEnable" Grid.Column="1" Content="启用" Margin="3" Click="buttonEnable_Click"/> <Button Name="buttonDisable" Grid.Column="2" Content="停用" Margin="3" Click="buttonDisable_Click"/> <Button Name="buttonListChildren" Grid.Column="3" Content="枚举子节点" Margin="3" Click="buttonListChildren_Click"/> </Grid> <TextBox Name="textBoxClassGuid" Grid.Row="1" Grid.Column="1" Margin="3" IsReadOnly="True" VerticalContentAlignment="Center" TextWrapping="Wrap"/> <TextBox Name="textBoxDevID" Grid.Row="2" Grid.Column="1" Margin="3" IsReadOnly="True" VerticalContentAlignment="Center" TextWrapping="Wrap" /> </Grid> </Border> </UserControl>
UserControlNodeItem.xaml.cs
using Com.FirstSolver.Splash; using Com.FirstSolver.USB; using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace Splash { /// <summary> /// UserControlNodeItem.xaml 的交互逻辑 /// </summary> public partial class UserControlNodeItem : UserControl { /// <summary> /// 设备节点编号 /// </summary> public uint DevNode { get; private set; } /// <summary> /// 即插即用设备编号 /// </summary> public string DevID { get; private set; } /// <summary> /// 设备安装类 /// </summary> public System.Guid ClassGuid { get; private set; } /// <summary> /// 用户控件所在的窗体 /// </summary> private Window Owner; /// <summary> /// 子节点显示列表框 /// </summary> private StackPanel StackPanelChildren; /// <summary> /// 构造函数 /// </summary> public UserControlNodeItem(Window owner, StackPanel stackPanelSub, uint devNode, string devID, System.Guid classGuid) { InitializeComponent(); // 初始化 Owner = owner; // 父窗体 StackPanelChildren = stackPanelSub; // 子节点显示列表框 DevNode = devNode; // 设备节点编号 DevID = devID; // 即插即用设备ID ClassGuid = classGuid; // 设备安装类GUID // 初始化当前设备节点 textBoxDevNode.Text = devNode.ToString(); textBoxClassGuid.Text = classGuid.ToString("B").ToUpper(); textBoxDevID.Text = devID; buttonListChildren.IsEnabled = (stackPanelSub != null); } // 启用设备 private void buttonEnable_Click(object sender, RoutedEventArgs e) { WDK_EnableDevNode(System.Guid.Empty); } // 停用设备 private void buttonDisable_Click(object sender, RoutedEventArgs e) { WDK_DisableDevNode(System.Guid.Empty); } private void buttonListChildren_Click(object sender, RoutedEventArgs e) { StackPanelChildren.Children.Clear(); Dictionary<uint, string> Children; if (EZUSB.CM_GetChildren(DevNode, out Children) == EZUSB.CR_SUCCESS) { foreach (KeyValuePair<uint, string> Item in Children) { StackPanelChildren.Children.Add(new UserControlNodeItem(Owner, null, Item.Key, Item.Value, EZUSB.CM_GetDevNodeClassGuild(Item.Key))); } } } private void WDK_EnableDevNode(System.Guid InterfaceGuild) { uint ErrorCode = EZUSB.WDK_ChangeDeviceState(ClassGuid, InterfaceGuild, DevID, EZUSB.DICS_ENABLE); if (ErrorCode == 0) { if (EZUSB.CM_IsEnabled(DevNode)) { MessageBoxPlus.Show(Owner, "启用设备成功!", "成功", MessageBoxButton.OK, MessageBoxImage.Information); this.Background = new SolidColorBrush(Colors.Green); } else { MessageBoxPlus.Show(Owner, "启用设备失败!", "失败", MessageBoxButton.OK, MessageBoxImage.Error); } } else { MessageBoxPlus.Show(Owner, "错误代码:0x" + ErrorCode.ToString("X"), "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } private void WDK_DisableDevNode(System.Guid InterfaceGuild) { uint ErrorCode = EZUSB.WDK_ChangeDeviceState(ClassGuid, InterfaceGuild, DevID, EZUSB.DICS_DISABLE); if (ErrorCode == 0) { if (EZUSB.CM_IsDisabled(DevNode)) { MessageBoxPlus.Show(Owner, "停用设备成功!", "成功", MessageBoxButton.OK, MessageBoxImage.Information); this.Background = new SolidColorBrush(Colors.Red); } else { MessageBoxPlus.Show(Owner, "停用设备失败!", "失败", MessageBoxButton.OK, MessageBoxImage.Error); } } else { MessageBoxPlus.Show(Owner, "错误代码:0x" + ErrorCode.ToString("X"), "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } } }