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

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

 

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
512 příspěvků
13. 8. 2018   #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:...–
13. 8. 2018   #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
512 příspěvků
14. 8. 2018   #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
512 příspěvků
14. 8. 2018   #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:...–
14. 8. 2018   #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.–
Jerry
~ Anonymní uživatel
512 příspěvků
14. 8. 2018   #7
-
0
-

#6 hlucheucho
teď sem to zkoušel jako službu ten příklad a funguje mi to i jako služba

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

takže nevim ned čim dumáš .. jestli to máš pro sebe na hraní použil bych ten příklad a jestli to máš do práce tak si to asi budeš muset překopat ... služba funguje ok ... detekuje se zasunutí i vysunutí USB zařízení ...

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:2c3f:...–
Jerry
~ Anonymní uživatel
512 příspěvků
15. 8. 2018   #8
-
0
-

#1 hlucheucho
jestli si chceš napsat službu tak tady je návod

https://blogs.msdn.microsoft.com/sergey_babkins_blog/2016/12/28/windows-service-wrapper-in-c/

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:9193:...–
15. 8. 2018   #9
-
0
-

Zajímají mne pouze dvě události: "COM x se připojil" a "COM x se odpojil". Vyžadovat VID a PID u převodníku USB/COM pro tento účel je nesmysl. Překopat to znamená v podstatě napsat svůj SW (hůře proveditelné).

Většina fungujících řešení používá ManagementEventWatcher a WqlEventQuery, s drobnými odchylkami v nastavení. Vždy je událost vyvolána vícekrát. Zkoušel jsem najít nastavení WqlEventQuery speciálně pro virtuální COM, bez úspěchu.

U kódu z příspěvku #1 stačí vyfiltrovat změnu stavu portu - pomocí "je / není na seznamu" a "byl / nebyl na seznamu", jeví se mi to jako cesta nejmenšího odporu (= dobře proveditelné).

hu

Nahlásit jako SPAM
IP: 195.178.67.–
15. 8. 2018   #10
-
0
-

#8 Jerry
jak napsat službu v C# - ve frameworku jsou připraveny třídy a dají se najít postupy přímo pro C#, není třeba řešit žádný opičárny s wraperem. Pro usnadnění práce mám vzorový projekt a ostatní dělám "na jedno brdo".

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
512 příspěvků
15. 8. 2018   #11
-
0
-

#10 hlucheucho
a napadlo tě využít nějak ten parametr "e" ?

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:9193:...–
16. 8. 2018   #12
-
0
-

#11 Jerry
napadlo, akorát jeho obsah nenese informaci o zařízení na kterém změna proběhla.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
512 příspěvků
16. 8. 2018   #13
-
0
-

#12 hlucheucho
no já bych ten tvuj problém řešil tak, že bych si vytvořil jednoduchou WindowsService, která by běžela pořád a detekovala 1x za sekundu připojení a odpojení různých zařízení tupu USB Disk. Tady je příklad na windows service  a funguje dobře:

https://code.msdn.microsoft.com/windowsapps/CppWindowsService-cacf4948

no a tato služba by do tvého běžícího programu předávala informace o typu (VID/PID adalší) zařízení,k teré bylo připojeno a odpojeno. Protože jde o to, že pokud je zařízení odpojené, tak o něm nic nezjistíš. Info už pak není k dipozici. zkus to nějak promyslet... je to jednoduché a funguje to

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:ad79:...–
Jerry
~ Anonymní uživatel
512 příspěvků
16. 8. 2018   #14
-
0
-

#13 Jerry
no takže bych řek že to funguje dobře ...jako služba

a tady je příklad jak detekovat zasunutí/vysunutí disku...

https://www.codeguru.com/columns/dotnet/detecting-usb-devices-using-c.html

funguje taky dobře ...

tady je přes C++

https://docs.microsoft.com/en-us/windows/desktop/devio/detecting-media-insertion-or-removal

a ještě tady

https://stackoverflow.com/questions/4078909/detecting-usb-insertion-removal-events-in-windows-using-c

no takže jediný co potřebuješ je vytvořit si tu službu .. spusit ji a pak už jen ve svém programu očekávat zprávu od služby ...

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:ad79:...–
Jerry
~ Anonymní uživatel
512 příspěvků
16. 8. 2018   #15
-
0
-

#14 Jerry
https://www.silabs.com/community/interface/knowledge-base.entry.html/2013/11/21/obtaining_devicenot-0ULM

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:ad79:...–
16. 8. 2018   #16
-
0
-

Samostatná služba bude službě posílat informaci znamená mít nějakou formu IPC - to znamená problém ještě více zkomplikovat. Informace typu VID, PID ... jsou irelevantní, nezáleží na tom, zda můj virtuální COM používá jako HW FT232, FT2232, CH40 nebo nějakej Atmel u originál Arduina. Moje služba potřebuje mít informaci o odebrání COMu aby korektně ukončila práci s COMem aniž by havarovala a potřebuje mít informaci o "vrácení" COMu aby znovu navázala spojení s periferií.

Zadání vypadá takto: každá služba (může jich na jednom počítači být několik) si hlídá svoje zařízení, přeruší komunikaci v případě odebrání zařízení (a může to i logovat do DB) a obnoví komunikaci při opětovném připojení zařízení (i to může logovat do DB). To znamená:

1. Při spuštění musí služba znát označení COMu, jeho nastavení (baudrate atd.). To je zapsáno v konfiguraci služby. 

2.Za běhu služba (mimo jiné) musí detekovat události odebrání a znovupřipojení COMu a reagovat na ně.

Bod 2 - detekce událostí byl důvod vzniku tohoto vlákna. Jde použít WMI jak jsem naznačil hned v #1, ale musí se událost vyfiltrovat, protože událost chodí na každé USB zařízení, nejen na virtuální COM. Lze použít funkci RegisterDeviceNotification, ale znamená to buď míchat C/C++ kód se C# se všemi problémy, které to přináší, a nebo psát celou službu v C/C++, což je hromada práce navíc oproti C#, navíc se bude muset opět nějakým způsobem vyfiltrovat jen události pro konkrétní COM.

Očekával jsem jednoduché elegantní řešení, lepší cestu než o které doteď uvažuji. Nejlépe vhodný polotovar. Zatím to vypadá, že lepší cesta není.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
512 příspěvků
16. 8. 2018   #17
-
-1
-
Mimo téma

#15 Jerry
a tadyhle je jak najít konkrétní zařízení s konkrétním VID PID

https://stackoverflow.com/questions/7599331/list-usb-device-with-specified-vid-and-pid-without-using-windows-driver-kit

takže to asi budeš muset vložit do služby ..

jestli existuje ekvivalent v .NET to nevim ale něco je tady

http://visualprog.cz/Net/DetectDeviceClasses.htm

nejdřív musíš získat GUID připojeného zařízení a to je tady

https://stackoverflow.com/questions/36453082/c-winapi-get-list-of-all-connected-usb-devices

takže  tim máš všechno co potřebuješ ..

část mužeš napsat v c++ jako Win32 Service a část jako .NET C# aplikaci

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:ad79:...–
Jerry
~ Anonymní uživatel
512 příspěvků
16. 8. 2018   #18
-
-1
-
Mimo téma

#16 hlucheucho
pokud chceš jenom detekovat připojení/odpojení USB tak funguje tohle

https://uloz.to/!VNNVP4gTXkAe/usbtest-zip

je to klasika .NET C# WinForms zkoušel sem to ve MS VS 2015.

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:ad79:...–
Jerry
~ Anonymní uživatel
512 příspěvků
16. 8. 2018   #19
-
-1
-
Mimo téma

#18 Jerry
našel sem eště tohle a funguje to pokud znáš GUID tvého USB

http://visualprog.cz/Net/DetectDeviceClasses.htm

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:ad79:...–
Jerry
~ Anonymní uživatel
512 příspěvků
16. 8. 2018   #20
-
-1
-
Mimo téma

#16 hlucheucho

tady je moc hezkej příklad jak najít USB zařízení, když znáš jeho VID-PID

https://stackoverflow.com/questions/7599331/list-usb-device-with-specified-vid-and-pid-without-using-windows-driver-kit

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:ad79:...–
16. 8. 2018   #21
-
0
-

#20 Jerry
jak u blbejch  na půdě. Jakýkoliv převodník USB / COM. VID, PID jsou irelevantní

hu

Nahlásit jako SPAM
IP: 195.178.67.–
16. 8. 2018   #22
-
0
-

#18 Jerry
Winforms... pro službu je nutná registrace pomocí funkce RegisterDeviceNotification, takže to zase napsat celé od A do Z.

Nahlásit jako SPAM
IP: 195.178.67.–
16. 8. 2018   #23
-
0
-

Prostě nic nového... stejné postupy, které tu byly, vesměs pro wokno. Pro službu překopat od podstaty. Navíc furt dokola vyžaduje identifikační znaky VID, PID, GUID.... na co?? Jediná identifikace je COM x (např COM 6).

hu

Nahlásit jako SPAM
IP: 195.178.67.–
16. 8. 2018   #24
-
0
-

   

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

namespace VCPdetector2
{
    public partial class Form1 : Form
    {
        public string portName = "COM6";
        public bool obsahoval;

        public Form1()
        {
            InitializeComponent();

            //pouzit v konstruktoru sluzby
            var remove_watcher = new ManagementEventWatcher();
            var remove_query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE (EventType = 3) OR (EventType = 2)");  //remove = 3, insert = 2
            remove_watcher.EventArrived += new EventArrivedEventHandler(watcher_Event);
            remove_watcher.Query = remove_query;

            //pouzit v udalosti OnStart sluzby
            obsahoval = IsPresented(portName);
            remove_watcher.Start();
        }

        private void watcher_Event(object sender, EventArrivedEventArgs e)
        {
            bool obsahuje = IsPresented(portName);
            if (obsahoval != obsahuje)
            {
                switch (e.NewEvent.Properties["EventType"].Value.ToString())
                {
                    case "2":
                        //akce pro "pripojen"
                        MessageBox.Show(portName + " inserted");
                        break;

                    case "3":
                        //akce pro "odpojen"
                        MessageBox.Show(portName + " removed");
                        break;
                }
            }
            obsahoval = obsahuje;
        }

        private bool IsPresented(string port_name)
        {
            string[] ports = SerialPort.GetPortNames();
            return Array.Exists(ports, element => element.Equals(portName));
        }
    }
}

Kód odvozený z #1 i s komentářem, jak by měl jít upravit pro službu. Zítra to mohu testnout ve službě např se zapisováním událostí do souboru.

Pozn. jsem zapomněl upravit jména proměnných aby odpovídala jejich funkci.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
512 příspěvků
17. 8. 2018   #25
-
0
-

no tak funkce SerialPort.GetPortNames() pouze vypíše existující porty COM, pokud má deska jeden fyzický port vypíše COM1. co se stane pokud nainstaluješ ovladač virtuálního com  portu to nevím. 

Jinými slovy ty máš nějaký procesor s USB portem nebo paměť a přes konvertor USB/RS232 ho připojuješ na COM port počítače. No mám pocit, že tohle funguje přes HID nebo jako druhá možnost je privátní ovladač třetí strany např. fi. Microchip a pod. 

https://social.msdn.microsoft.com/Forums/en-US/a9c11ed5-b341-4843-8084-dc3f5d852a7e/detect-usb-in-rt-c-based-on-device-manager-hid-using-vid-pid-windows-7?forum=csharpgeneral

normálně se seznam všech připojených zařízení zjistí takhle

https://stackoverflow.com/questions/36453082/c-winapi-get-list-of-all-connected-usb-devices

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:f4e6:...–
17. 8. 2018   #26
-
0
-

Převodník USB / COM patří podle specifikací USB do CDC (Communication Device Class). GetPortNames mi vrátí seznam portů vč. virtuálních jako string[]. Na virtuálním COMu může být jakékoliv zařízení používající RS232, RS422 nebo RS485, dále pak HW vytvořený na bázi Arduina a tovární přístroje s integrovaným převodníkem USB / COM. Atmel (dnes Microchip) vytvoří virtuální COM, Atmel v App. Notes přiznává, že k tomu ohýbá obecné ovladače HID. Pro mne je to vždy COM bez ohledu na to, jaký hardware je mezi službou a sériovou linkou, která tam ve většině případů opravdu je. Důležité je poznat ztrátu virtuálního COMu a ve službě uvolnit systémové prostředky abych při opětovném připojení COMu mohl znovu navazovat spojení. 

Na stackoverflow jsem narazil na jedno úsměvné řešení: přilepit konektor a tím pádem nějakou detekci neřešit.

Ve svém HW používám převodníky FTDI a jejich API, pak jsou k dispozici unikátní identifikační znaky zařízení a lze s nimi pracovat.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
512 příspěvků
17. 8. 2018   #27
-
0
-

#26 hlucheucho
přiznám se, že nevím jestli je možné řešit identifikaci připojení/odpojení na zařízení COM DSUB9pin. Podle mě je to možné jen podle stavu komunikace tedy timeout. Schopnost detekovat připojení/odpojení na základě napě´tových signálů má jen USB (a firewire). Pokud jsem tohle dělal dřív, používal jsem pro detekci připojení/odpojení při práci s RS232 při napojení na PC  jen funkci "communication time-out". T.j. zařízení nekomunikuje po určitou dobu.

Nicméně, dnes už existují procesory s nativním USB rozhraním takže s COM na moderním PC sem nedělal už spoustu let. Při komunikaci po USB využívám ovladač HID nebo plnohodnotný ovladač. Je ale pravda, že pokud se dělá něco na zakázku, je lepší využít LAN konektor RJ45, pokud to de, protože se prostě lépe využívají jak drivery tak i hardware a převodník USB-Ethernet(RJ45) se sehnat dá v pohodě.

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:85d5:...–
17. 8. 2018   #28
-
0
-

Znovu: celou dobu se tady nebavím o dění na sériové lince. Tam, kde je připojeno zařízení odpojitelným kabelem do převodníku USB / COM, se toho moc udělat nedá, tam, kde je to na jedné DPS, je přerušení sériové linky nepravděpodobné. V obou případech ztráta komunikace nezablokuje systémové prostředky a lze zkoušet navazovat komunikaci pokus - úspěch/neúspěch. Procesory s USB na čipu opět většinou tvoří virtuální COM aby se k tomu nemusely dělat ovladače - jejich vývoj je komplikovaná záležitost. Použití LAN je jen způsob, jak věc zkomplikovat. Převodník, switch, IP adresa... a viry. Je to jako jít s kladivem na komára.

Jde mi čistě o detekci odpojení převodníku z USB. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
512 příspěvků
18. 8. 2018   #29
-
-1
-
Mimo téma

#28 hlucheucho

já ti rozumim, ale jde o to, že když máš nějaké USB zařízení třeba procesor s USB a připojíš ho přes USB převodník na COM port počítače tak COM port NEMA hardwarovou detekci připojení/odpojení a když sem tohle dělal tak sem to dělal přes "communication time out" funkci, jednoduše se cca každou 1sec posílal DUMMy paket jen pro zjištění zda to je nebo neni připojený. Když to máš opačně tedy na USB port v PC připojuješ převodník RS232->USB tak je to to samý. Ledaže by sis dodělal nějaký svuj privátní HW sidnál, ale nevim jak možná přes některý ze signálu DCD/DTR/RI. No a co se týká komunikace jako takový tak protože je komunikace přes RS232 pomalá tak se vyčlenil jeden levný ATMEL jako tzv. "komunikační procesor" a na něj přes sběrnici SSI nebo klasickou 4/8bitovou sběrnici byl připojen hlavní řídící procesor. 

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:3190:...–
18. 8. 2018   #30
-
0
-

Detekce ztráty převodníku USB/COM způsobem "občas tam něco pošlu a když vyprší timeout ..." je nespolehlivá. A proto to chci řešit jinak. OS má potřebné informace a je možné je od něj získat. Cestu jsem ukázal ve #24.

Pořád se babráš ve všem okolo a k podstatě věci nejdeš. Zajímá mne odpojení a připojení hardware z/do USB. Vše ostatní je mlácení prázdné slámy.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:e946:a...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×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: 0 registrovaných, 44 hostů

 

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