Detekce odpojení / připojení převodníku USB/COM – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

Detekce odpojení / připojení převodníku USB/COM – .NET – Fórum – Programujte.comDetekce odpojení / připojení převodníku USB/COM – .NET – Fórum – Programujte.com

 

Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
10. 8. 2018   #1
-
0
-

Ahoj,

pro jednu Windows Service potřebuji detekovat odebrání a připojení USB zařízení, které pracuje jako virtuální COM.  Po hledání jsem narazil na kód, který rozpozná připojení/odpojení jakéhokoliv USB zařízení. Co mne však udivuje, že je handler události volán 6x pro jednoduchá zařízení a 7x pro zařízení se 2 COMy.  Při prvním volání handleru watcher_EventInsert "můj" COM není na seznamu, při dalších (5 nebo 6) voláních už je.

using System.Windows.Forms;
using System.Management;
using System.IO.Ports;

namespace VCPdetector2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var remove_watcher = new ManagementEventWatcher();
            var remove_query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3");  //remove = 3, insert = 2
            remove_watcher.EventArrived += new EventArrivedEventHandler(watcher_EventRemove);
            remove_watcher.Query = remove_query;
            remove_watcher.Start();

            var insert_watcher = new ManagementEventWatcher();
            var insert_query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");  //remove = 3, insert = 2
            insert_watcher.EventArrived += new EventArrivedEventHandler(watcher_EventInsert);
            insert_watcher.Query = insert_query;
            insert_watcher.Start();
        }

        private void watcher_EventInsert(object sender, EventArrivedEventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            MessageBox.Show("inserted");
        }

        private void watcher_EventRemove(object sender, EventArrivedEventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            MessageBox.Show("removed");
        }
    }
}

Jak dosáhnout aby každá událost byla volána 1x a při její obsluze jsem zjistil, zda se týkala "mého" COMu? Nebo se na to musí jinak?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
167 příspěvků
Včera   #2
-
0
-

#1 hlucheucho
já teda nevim proč ti to dělá 6x ale řešení je plnej internet  tak zkus jiný řešení, no v nejhorším případě si to budeš muset naprogramovat v C++ objektově a pak udělat řízený wrapper v C++/CLI :)

jo a eště při detekci zařízení se prohledává celý strom USB zařízení, takže pokud máš připojených více zařízení tak ti enumeruje všechny tedy 6

https://stackoverflow.com/questions/6003822/how-to-detect-a-usb-drive-has-been-plugged-in

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/241b6ff5-4563-4c6f-a7f7-18e0a7874204/detecting-if-a-specific-usb-is-connected?forum=csharpgeneral

https://www.codeproject.com/Tips/1185385/How-to-Detect-When-Your-USB-Device-Has-Been-Plugge

https://www.codeproject.com/Articles/60579/A-USB-Library-to-Detect-USB-Devices

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:19e1:...–
Včera   #3
-
0
-

#2 Jerry
řešení je plnej internet 

hodně z nich nefunguje vůbec.

naprogramovat v C++ objektově a pak udělat řízený wrapper v C++/CLI :)

mi přeješ radosti :)

jo a eště při detekci zařízení se prohledává celý strom USB zařízení, takže pokud máš připojených více zařízení tak ti enumeruje všechny tedy 6

Zkoušel jsem to s více zařízeními, s počtem zařízení rostl i počet volání event handleru. Těch 5 kousků bude asi uvnitř počítače (kořenový rozbočovač ...).

Takže buď filtrovat změnu stavu mého hardware nebo časovačem volat GetPortNames, ale i u toho bych musel filtrovat změnu stavu.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
167 příspěvků
před 8 hodinami   #4
-
0
-

#3 hlucheucho

tady by měla bejt funkční verze detekce zasunutí nebo vysunutí USB zařízení pomocí native WinAPI32

https://social.msdn.microsoft.com/Forums/vstudio/en-US/cc2ff1a4-e0c6-4a45-b03e-d84abb15d6f6/detecting-the-insertion-and-removal-of-a-usb-drive?forum=vcgeneral

pokud ti to bude fungovat tak přepsat příklad do objektů třeba v MS VS 2017 C++ Win32 a napsat k tomu řízený wrapper v C++/CLI a tedy s možností využití i v C# už není až velká práce. 

navíc lze celou sestavu nechat spuštěnou jako windows service - ideálně bez okna 


Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:64f3:...–
Jerry
~ Anonymní uživatel
167 příspěvků
před hodinou   #5
-
0
-

#1 hlucheucho
zkoušel sem tohle

https://www.codeproject.com/Articles/60579/A-USB-Library-to-Detect-USB-Devices

a funguje OK. :)

ale např. pod VMVare se mi nepodařilo detekovat to pod správným VID pouze pod VID nadřazeného hostitele ...

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:2c3f:...–
před 9 minutami   #6
-
0
-

#5 Jerry
Zkoušel jsi to jako součást služby Windows? Ono mezi woknem a službou jsou rozdíly.

Při prohrabávání další kopy hnoje jsem narazil na https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-registerdevicenotificationa Je tam vysvětleno, jak zaregistrovat pro službu. Takže pokud je v nějaké knihovně "zadrátováno" registrování pro wokno (vypadá to, že to tak je), tak pro službu to chodit nebude.

A ukázkový kód https://docs.microsoft.com/cs-cz/windows/desktop/DevIO/registering-for-device-notification je dlouhý jak týden před výplatou. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 1 registrovaný, 116 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032018 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý