Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  9 1679
SHARKFACEGANG
mkey's Avatar
Hei!

Jeg tutler på med et lite program hvor jeg har et ønske om å "merke" endringer ved eventuelle strømbrudd (laptop går over til batteri) og frakobling av usb (i mitt tilfelle en gsm-modul).

Jeg brukte en WMI Code Creator som lager ferdig kode for de forskjellige eventene, men da jeg kopierer den genererte koden inn i Visual Basic, får jeg feilmeldinger. Litt usikker på hva jeg skal gjøre.

Er temmelig ny innen programmering, men legger til kode for endring i strømstyringen samt feilliste.

Link til WMI Code Generator

using System;
using System.Management;
using System.Windows.Forms;

namespace WMISample
{
public class WMIReceiveEvent
{
public static void Main()
{
try
{
WqlEventQuery query = new WqlEventQuery(
"SELECT * FROM Win32_PowerManagementEvent");

ManagementEventWatcher watcher = new ManagementEventWatcher(query);
Console.WriteLine("Waiting for an event...");

ManagementBaseObject eventObj = watcher.WaitForNextEvent();

Console.WriteLine("{0} event occurred.", eventObj["__CLASS"]);

// Cancel the event subscription
watcher.Stop();
return;
}
catch(ManagementException err)
{
MessageBox.Show("An error occurred while trying to receive an event: " + err.Message);
}
}
}
}
Vis hele sitatet...
Error 5 The type or namespace name 'ManagementBaseObject' could not be found (are you missing a using directive or an assembly reference?) xProsjekter\WindowsFormsApplication5\WindowsFormsApplicati on5\Program.cs 19 17 WindowsFormsApplication5
Error 3 The type or namespace name 'ManagementEventWatcher' could not be found (are you missing a using directive or an assembly reference?) xProsjekter\WindowsFormsApplication5\WindowsFormsApplicati on5\Program.cs 16 17 WindowsFormsApplication5
Error 4 The type or namespace name 'ManagementEventWatcher' could not be found (are you missing a using directive or an assembly reference?) xProsjekter\WindowsFormsApplication5\WindowsFormsApplicati on5\Program.cs 16 54 WindowsFormsApplication5
Error 6 The type or namespace name 'ManagementException' could not be found (are you missing a using directive or an assembly reference?) xProsjekter\WindowsFormsApplication5\WindowsFormsApplicati on5\Program.cs 27 20 WindowsFormsApplication5
Error 1 The type or namespace name 'WqlEventQuery' could not be found (are you missing a using directive or an assembly reference?) xProsjekter\WindowsFormsApplication5\WindowsFormsApplicati on5\Program.cs 13 17 WindowsFormsApplication5
Error 2 The type or namespace name 'WqlEventQuery' could not be found (are you missing a using directive or an assembly reference?) xProsjekter\WindowsFormsApplication5\WindowsFormsApplicati on5\Program.cs 13 43 WindowsFormsApplication5
Vis hele sitatet...
Har du lagt inn System.Management under Add Reference i prosjektinnstilligene?
SHARKFACEGANG
mkey's Avatar
Trådstarter
Ah, da fungerte det! Trodde det skjedde automagisk, men den gang ei. Mange takk!

For å dra denne posten lengre, ved bruk av Win32_PowerManagementEvent og Win32_DeviceChangeEvent oppnår jeg å få en tilbakemelding dersom det er en endring som frakobling/tilkobling av strøm og frakobling/tilkobling av hvilken som helst usb.

Jeg ønsker å vite hvilken usb som er frakoblet, og om strømkabelen er tilkoblet eller frakoblet.

Noen innspill på dette?
Har du noe mer kode å vise til, eller er det du postet i første innlegg det eneste?

Edit:

Sjekk disse:

http://www.codeproject.com/Articles/...in-a-C-Program

http://dotnetslackers.com/community/...using-wmi.aspx
Sist endret av bronsky; 20. februar 2013 kl. 19:51.
SHARKFACEGANG
mkey's Avatar
Trådstarter
Takker for svar, etter litt knoting fant jeg ut at det gikk an å indentifisere de ulike usb-enhetene ved pid og vid, og brukte dette til min fordel. Er jo bare basic code sålangt, men er på vei til mitt mål. Legger ved koden dersom noen lurer på det samme engang.

USB tilkoblet/ikke tilkoblet.
class Program
{
public static bool IsUsbDeviceConnected(string pid, string vid)
{
using (var searcher =
new ManagementObjectSearcher(@"Select * From Win32_USBControllerDevice"))
{
using (var collection = searcher.Get())
{
foreach (var device in collection)
{
var usbDevice = Convert.ToString(device);

if (usbDevice.Contains(pid) && usbDevice.Contains(vid))
return true;
}
}
}
return false;
}

static void Main(string[] args)
{
bool mus;
mus = IsUsbDeviceConnected("046D", "C245");
switch (mus)
{
case true:
Console.WriteLine("Mus er koblet til");
break;
case false:
Console.WriteLine("Mus er koblet fra");
break;
}
Console.ReadLine();


}
}
Vis hele sitatet...
Strømkabel tilkoblet/ikke tilkoblet

class Program
{
static void Main(string[] args)
{

string strPowerLineStatus = string.Empty;

switch (SystemInformation.PowerStatus.PowerLineStatus)
{
case PowerLineStatus.Offline:
strPowerLineStatus = "Strømkabel er koblet fra";
break;
case PowerLineStatus.Online:
strPowerLineStatus = "Strømkabel er koblet til";
break;
case PowerLineStatus.Unknown:
strPowerLineStatus = "Ukjent feil";
break;
}


Console.WriteLine(strPowerLineStatus);
Console.ReadLine();

}
}
Vis hele sitatet...
Sist endret av mkey; 21. februar 2013 kl. 23:59.
Hm, så det du gjør her er å kjøre programmet for å sjekke status periodisk? Hadde det ikke vært greiere å kunne ha samme prosessen kjørende og så gjøre det du ønsker dersom en callback eller event ble utført? Ut i fra det jeg umiddelbart ser fra koden din så virker det til at dette er en prosess som periodisk kjøres. Er dette med vilje? Eventuelt, er dette kun eksempelkode som du gir her?
SHARKFACEGANG
mkey's Avatar
Trådstarter
Jeg kalte det "basic code", men det jeg mente var eksempelkode ja. Fikk bare endelig til at det skulle gjøre det jeg ville, så neste step blir å kunne kjøre det som du sier med en tilbakemelding når eventen skjer.

Dog som nevnt tidligere er jeg ganske ny i gamet, men lurer på om det hadde vert mulig å benytte meg av threading til dette formålet. Må nesten bare lese meg litt opp, kan jo legge ut fullstending kode når jeg omsider har funnet ut av det.
Du trenger ikke å bruke threading til dette. Jeg ser i klassen at det eksisterer en event som heter EventArrived som nok kan brukes.

Hvis det passer seg så kan du lage deg en windows service som kjøres i bakgrunnen (svchost) som monitorerer eventen og behandler det derifra.

Relevant lesestoff:
http://msdn.microsoft.com/en-us/libr...ntarrived.aspx
http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
http://www.codeproject.com/Articles/...s-Service-in-C
Sist endret av m0b; 22. februar 2013 kl. 22:50.
Man kan vel også med få tastetrykk sette opp task scheduler til å trigge på en event som oppfyller visse kriterier. Er bare å finne en event i event viewer, høyreklikke på den og så velge "Attach task to this event...".

Dette er selvsagt lite portabelt om du har tenkt å distribuere programmet ditt, men er en helt kurant løsning på få maskiner. Tasken kan gjøre nærsagt hva som helst, inkludert å starte opp programmet du allerede har laget.
▼ ... over en uke senere ... ▼
SHARKFACEGANG
mkey's Avatar
Trådstarter
Da har jeg ihvertfall fått til events, har ikke fått lagt koden inn i mitt ferdige program enda, men har laget noen små consollprogrammer som viser at de fungerer. Legger kildekoden ved dersom noen er interesserte.

http://wiii.no/Kode/powercheckevent.zip

http://wiii.no/Kode/USBcheckevent.zip

-edit: koden har også kommentarer.

Gjerne kom med tilbakemeldinger dersom det noe jeg kan utbedre

(Usbsjekkeren fungerer bare på min mus, dersom en vil bruke det på annet utstyr på det byttes i programmet som er kommentert)
Sist endret av mkey; 7. mars 2013 kl. 14:43.