pneau
Messages postés258Date d'inscriptionmercredi 21 avril 2004StatutMembreDernière intervention27 octobre 2010
-
27 oct. 2010 à 17:02
cadweb -
10 oct. 2012 à 16:52
Bonjour,
j'ai réalisé un petit bout de code qui permet d'installer une imprimante sur un port USB.
Cette petite appli attend que l'utilisateur branche son imprimante sur le port USB pour l'installer sur le bon port. Pour cela, je désactive temporairement le lancement automatique du Wizard d'installation des imprimantes.
on imprimante s'installe correctement sur le port USB.
Le souci, c'est que lorsque je l'éteint puis la rallume, Windows me demande d'installer une nouvelle imprimante...
Visiblement la fonction "AddPrinter" de WMI ne fait pas tout et j'aurais aimé un coup de main pour corriger ce petit probleme.
merci d'avances
Je joint ci dessous le code...
private void Button_Click_2(object sender, RoutedEventArgs e)
{
_fin = false;
ManagementEventWatcher w = null;
WqlEventQuery q;
ManagementOperationObserver observer = new ManagementOperationObserver();
// Bind to local machine
ManagementScope scope = new ManagementScope("root\\CIMV2");
scope.Options.EnablePrivileges = true; //sets required privilege
try
{
//Lancement de l'écoute des évènements sur le port USB
q = new WqlEventQuery();
q.EventClassName = "__InstanceOperationEvent";
q.WithinInterval = new TimeSpan(0, 0, 3);
q.Condition = @"TargetInstance ISA 'Win32_PnPEntity' ";
w = new ManagementEventWatcher(scope, q);
w.EventArrived += new EventArrivedEventHandler(UsbEventArrived);
w.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
_nomImprimante = string.Empty;
_port = string.Empty;
DateTime waitForAction = DateTime.Now;
while (!_fin)
{
if ((DateTime.Now - waitForAction).TotalSeconds > 30)
{
//On attend un max de 30 seconds, si rien ne se passe, on arrete
break;
}
}
w.Stop();
if (!string.IsNullOrEmpty(_nomImprimante) && !string.IsNullOrEmpty(_port))
{
//Ajout de l'imprimante
MessageBox.Show(AjouterImprimante("Generic / Text Only", _port, _nomImprimante, "la bas"));
}
}
}
public void UsbEventArrived(object sender, EventArrivedEventArgs e)
{
foreach (PropertyData pd in e.NewEvent.Properties)
{
ManagementBaseObject mbo = null;
if ((mbo = pd.Value as ManagementBaseObject) != null)
if (mbo.Properties["Service"] != null)
{
string service = mbo.Properties["Service"].Value as string;
if (service != "usbprint")
{
_deviceID = mbo.Properties["PNPDeviceID"].Value.ToString();
if (_deviceID.StartsWith("USBPRINT"))
{
//On vient de brancher ou d'allumer une imprimante
_nomImprimante = mbo.Properties["Name"].Value.ToString() ;
string[] tabDevice = _deviceID.Split('&');
_port = tabDevice[tabDevice.Count() - 1];
string Port = mbo.Properties["PNPDeviceID"].Value.ToString();
}
}
}
}
}
}
_fin = true;
}
if (driver null || driver "")
throw new ArgumentNullException(driver, "Le nom du driver ne peut pas être vide");
if (port == null || port== "")
throw new ArgumentNullException(port, "Le nom du port ne peut pas être vide");
if (nom null || nom "")
throw new ArgumentNullException(nom, "Le nom de l'imprimante ne peut pas être vide");
if (emplacement null || emplacement "")
throw new ArgumentNullException(emplacement, "L'emplacement ne peut pas être vide");
try
{
connectionOptions = new ConnectionOptions();
connectionOptions.EnablePrivileges = true;
managementPath = new ManagementPath("Win32_Printer");
managementScope = new ManagementScope("\\root\\CIMV2", connectionOptions);
printer = new ManagementClass(managementScope, managementPath, null).CreateInstance();
putOptions = new PutOptions();
putOptions.Type = PutType.UpdateOrCreate;
printer.Put(putOptions);
//Si on arrive ici, c'est que l'imprimante a bien été créée.
nomImprimante = nom;
}
catch (Exception)
{
throw;
}
return nomImprimante;
}
Pat
Don't Worry , Be Happy
lorsque le problème est résolu, pensez Réponse Acceptée
je pense que si l'installation de l'imprimante est bloquée (comment d'ailleurs ?), le port n'est pas créé, et comme le port n'est pas créé par le printer.put() ça ne fonctionne pas.