c# Comports externer anwendungen schließen / Status ermitteln

Gast #1982394
Lesenswert?

Hallo,

kennt ihr eine Möglichkeit, die verwendeten Com Ports, die von externen 
Anwendungen benutzt werden zu schließen?

Idealerweise möchte ich so etwas in c# realisieren.

Zudem suche ich eine Möglichkeit in c# an den Eintrag des COM Ports aus 
dem Gerätemanager zu "holen" bzw. von welchem Programm der Port geöffnet 
wurde.

Danke und Gruß
technikus
Gast #1983885
Lesenswert?

Damit kommt man an die Namen der verfügbaren COM-Ports:
1
string[] portNames=SerialPort.GetPortNames();

Herausfinden welche Anwendung einen COM-Port belegt erfordert einen 
Treiber (für Dateien hätte UserMode ausgereicht, siehe z.B.: 
http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx)

Mein Tipp:
Hol dir den DeviceName aus der Registry und frag Handle.exe nach der 
Anwendung die da den COM-Port blockiert.

DeviceNames der COM-Ports holen (ab Win2k/XP, nicht Win9x und älter!):
1
public class SerialPortInfo
2
        {
3
            public string DosName = "";
4
            public string DeviceName = "";
5
        }
6

7
        public static List<SerialPortInfo> GetSerialPorts()
8
        {
9
            List<SerialPortInfo> ports = new List<SerialPortInfo>();
10

11
            using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM", false))
12
            {
13
                string[] valNames=rk.GetValueNames();
14

15
                foreach (string deviceName in valNames)
16
                {
17
                    string dosName=rk.GetValue(deviceName) as string;
18
                    SerialPortInfo spi = new SerialPortInfo();
19
                    spi.DosName = dosName;
20

21
                    if (deviceName.StartsWith("\\"))
22
                    {
23
                        spi.DeviceName = deviceName;
24
                    }
25
                    else
26
                    {
27
                        spi.DeviceName = "\\device\\" + deviceName;
28
                    }
29

30
                    ports.Add(spi);
31
                }
32
            }
33

34
            return ports;
35
        }

Handle.exe Aufruf z.B.: "handle.exe -a \Device\Winachsf0" - 
"\Device\Winachsf0" ist dabei der DeviceName.

Handle.exe: http://technet.microsoft.com/en-us/sysinternals/bb896655
Gast #1985025
Lesenswert?

@ bluppdidupp:

Vielen dank für deine wertvollen Tipps!

Ich bin zwar "noch" C# Einsteiger und kann
1
List<SerialPortInfo> ports = new List<SerialPortInfo>();

"<>" zwar noch nicht nachvollziehen. Nach einem Blick in die Registry 
ist aber klar das ich den Namen benötige.

Ich habe bloß noch nicht verstanden wie ich handle.exe anschmeiße.

Danke!

Gruß
technikus

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren