Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

C-Sharp - Schreiben in die Zwischenablage

Frage Entwicklung Visual Studio

Mitglied: rana-mp

rana-mp (Level 1) - Jetzt verbinden

29.04.2014, aktualisiert 30.04.2014, 1826 Aufrufe, 3 Kommentare

Hallo zusammen,

ich habe ein Problem, was fuer mich als relativ unerfahrenen Programmierer im Momoment unloesbar erscheint.

Ein wenig Hintergrund: Ich habe einen USB Smardcard Leser, der intern mit einem FTDI USB to Serial Chip angebunden ist, unter Windows also nur eine schnoede COM Schnittstelle bereitstellt.
Das Ding ist schon ein paar Jaehrchen aelter, und eine spezialle Software dafuer gibt es nicht. Kurze Tests mit Putty haben ergeben das er die Katennummer im Klartext ueber die Schnittstelle jagt, da dachte ich mir, schreib ich mir doch fix mein eigenes Programm. Dies in C#, da ich da noch am meisten Erfahrung habe. Das Programm soll die Kartennummer auslesen und anschliessend diese in die Zwischenablage kopieren.

Hier mein kompletter Code:
01.
using System; 
02.
using System.Text; 
03.
using System.IO.Ports; 
04.
using System.Windows; 
05.
 
06.
namespace ConsoleApplication1 
07.
08.
    class Program 
09.
10.
        [STAThread] 
11.
        static void Main(string[] args) 
12.
13.
            SerialPort mySerialPort = new SerialPort(); 
14.
         
15.
            Console.WriteLine("Please enter the Number of the COM Port of the Cardreader as seen in the Devicemanager.\n"); 
16.
             
17.
            //COM ID has to be user supplied 
18.
            mySerialPort.PortName = "COM"+Console.ReadLine(); 
19.
 
20.
            //Serialport properties. These are customized for the Cardreader 
21.
            mySerialPort.BaudRate = 9600; 
22.
            mySerialPort.Parity = Parity.None; 
23.
            mySerialPort.StopBits = StopBits.One; 
24.
            mySerialPort.DataBits = 8; 
25.
            mySerialPort.Handshake = Handshake.XOnXOff; 
26.
 
27.
            //Eventhandler is fired twice everytime a card is read 
28.
            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 
29.
 
30.
            try 
31.
32.
                mySerialPort.Open(); 
33.
34.
            catch 
35.
36.
                Console.WriteLine("Cannot open COM Port. Please check if the Port is correct and not already in use"); 
37.
                Console.WriteLine("Press any key to exit..."); 
38.
                Console.ReadKey(); 
39.
                return; 
40.
41.
 
42.
            Console.WriteLine("Program Ready"); 
43.
            Console.WriteLine("Read Card or press any key to exit"); 
44.
            Console.WriteLine(); 
45.
            Console.ReadKey(); 
46.
            mySerialPort.Close(); 
47.
48.
 
49.
        [STAThread] 
50.
        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
51.
52.
            SerialPort sp = (SerialPort)sender; 
53.
            Char[] Buffer = new Char[20]; 
54.
             
55.
            //Sleep is required to give the device enough time to buffer the complete Card ID 
56.
            System.Threading.Thread.Sleep(500); 
57.
            sp.Read(Buffer, 0, 20); 
58.
             
59.
 
60.
            String cardID = ""; 
61.
 
62.
            //If the card is read multiple times in too short a time, the event fires again before the buffer is completely read. If that happens parts of the buffer are empty 
63.
            //This is to check if the buffer only has digits in it (which makes it a valid card ID) 
64.
            foreach (Char Ziffer in Buffer) 
65.
66.
                if (Ziffer == '0' || Ziffer == '1' || Ziffer == '2' || Ziffer == '3' || Ziffer == '4' || Ziffer == '5' || Ziffer == '6' || Ziffer == '7' || Ziffer == '8' || Ziffer == '9') 
67.
68.
                    cardID = cardID + Ziffer.ToString(); 
69.
70.
71.
            //when there are 20 digits in the ID, it is valid 
72.
            if (cardID.Length == 20) 
73.
74.
                Console.WriteLine(cardID); 
75.
                System.Windows.Clipboard.SetText(cardID); 
76.
77.
            //If there are some digits in the ID, but not 20, that is the result of a too fast re-read 
78.
            else if (cardID.Length != 0) 
79.
80.
                Console.WriteLine("Read Error {0}", cardID.Length); 
81.
82.
            //on an OK read, on the second firing of the event, the buffer will be empty 
83.
            else if (cardID.Length == 0) 
84.
85.
                Console.WriteLine("Read OK"); 
86.
87.
            //Console.WriteLine(""); 
88.
            cardID = ""; 
89.
90.
91.
}
Grundlegend funktioniert dieser Code so wie er sollte und kann auch Fehler beim Lesen kompensieren. Aber beim schreiben in die Zwischenablage bekomme ich folgende Fehlermeldung:
01.
Current thread must be set to single thread apartment (STA) mode before OLE calls can be made.
Dazu findet man haufenweise im Netz, aber die fast immer angegebene Standardloesung [STAThread] an die Main anzufuegen funktioniert hier nicht. Dabei ist es egal ob ich die Clipboard Klasse aus System.Windows oder aus System.Windows.Forms nehme, beides gibt den gleichen Fehler.

Gruss,

rana-mp


Mitglied: colinardo
LÖSUNG 29.04.2014, aktualisiert 30.04.2014
Hallo rana-mp,
das ist etwas schwierig zu erklären, das liegt aber daran wie [Single Thread Appartments] funkionieren. Das steht hier erklärt:http://msdn.microsoft.com/en-us/library/windows/desktop/ms680112%28v=vs ...

The DataReceived event is raised on a secondary thread when data is received from the SerialPort object. Because this event is raised on a secondary thread, and not the main thread, attempting to modify some elements in the main thread, such as UI elements, could raise a threading exception. If it is necessary to modify elements in the main Form or Control, post change requests back using Invoke, which will do the work on the proper thread.
http://stackoverflow.com/questions/17175783/prevent-event-from-spawning ...

Das hier sollte aber alternativ dazu problemlos funktionieren: (dann musst du auch nicht so eine große Referenz wie "Windows.Forms" zu deiner Console-App hinzufügen)
Nutze das Win32-API dazu (Beispiel):
01.
using System; 
02.
using System.Runtime.InteropServices; 
03.
 
04.
namespace ConsoleApplication1 
05.
06.
    class Program 
07.
08.
        [DllImport("user32.dll")] 
09.
        internal static extern bool OpenClipboard(IntPtr hWndNewOwner); 
10.
 
11.
        [DllImport("user32.dll")] 
12.
        internal static extern bool CloseClipboard(); 
13.
 
14.
        [DllImport("user32.dll")] 
15.
        internal static extern bool SetClipboardData(uint uFormat, IntPtr data); 
16.
         
17.
        [STAThread] 
18.
        static void Main(string[] args) 
19.
20.
            Console.WriteLine("Bitte einen Text eingeben und mit Enter bestätigen:"); 
21.
            String myText = Console.ReadLine(); 
22.
 
23.
            //Text ans Clipboard senden 
24.
            OpenClipboard(IntPtr.Zero); 
25.
            var ptr = Marshal.StringToHGlobalUni(myText); 
26.
            SetClipboardData(13, ptr); 
27.
            CloseClipboard(); 
28.
            Marshal.FreeHGlobal(ptr); 
29.
            //------------------------ 
30.
 
31.
            Console.WriteLine("Dein Text wurde in die Zwischenablage kopiert! Drücke eine Taste zum beenden"); 
32.
            Console.ReadLine();    
33.
34.
35.
}
Bitte warten ..
Mitglied: rana-mp
30.04.2014 um 10:28 Uhr
Hallo colinardo,

auch wenn ich gesetehen muss das ich den Code (noch) nicht 100%tig verstehe, so funktioniert es doch einwandfrei

Vielen dank.
Bitte warten ..
Mitglied: papasmurf
11.07.2014 um 16:40 Uhr
The copy-to-clipboard code in question is slightly problematic. StringToHGlobalUni doesn't do what it is natural to think it does. It actually uses LocalAlloc with LMEM_FIXED, but SetClipboardData requires memory allocated with GlobalAlloc and GMEM_MOVABLE. The code can thus cause crashes.

Here's a link to my response on the subject on StackOverflow, which you can follow to get a more robust solution on GitHub if you'd like:

http://stackoverflow.com/a/24698804/2682101
Bitte warten ..
Ähnliche Inhalte
IDE & Editoren
IDE für C-Sharp und C++ auf Windows
gelöst Frage von BugdroidIDE & Editoren8 Kommentare

Hallo, Ich nutze derzeit Visual Studio, aber auf Dauer ist es mir etwas zu Ressourcenfressend und für meine Zwecke ...

C und C++
C Sharp XAML Universal
Frage von DippsC und C++3 Kommentare

Hallo ich versuche gerade mit C#2015 ein Projekt Universal XAML zu erstellen um auf einem Raberry PI 2 mit ...

C und C++
C-sharp SearchPattern (Regex)
Frage von YanmaiC und C++6 Kommentare

Hallo ihr Administratoren, ich verwende ein AUtocpmpletemenu Plugin. Dort habe ich Snippets, die dann sozusagen completed werden. Beim erstellen ...

C und C++
C-sharp Form buggt
gelöst Frage von YanmaiC und C++2 Kommentare

Hallo ihr Administratoren. Ich habe ein kleines Problem. Unszwar möchte ich eine Ordner von C# zu einem PHP Script ...

Neue Wissensbeiträge
Internet

Was nützt HTTPS, wenn es auch von Phishing Web-Seiten genutzt wird

Information von Penny.Cilin vor 2 TagenInternet17 Kommentare

HTTPS richtig einschätzen Ob man eine Webseite via HTTPS aufruft, zeigt ein Schloss neben der Adresse im Webbrowser an. ...

Webbrowser

Bugfix für Firefox Quantum released - Installation erfolgt teilweise nicht automatisch!

Erfahrungsbericht von Volchy vor 3 TagenWebbrowser7 Kommentare

Hallo zusammen, gem. dem Artike von heise online wurde mit VersionFirefox 57.0.1 sicherheitsrelevante Bugs behoben. Entgegen der aktuellen Veröffentlichung ...

Sicherheit

Teamviewer Sessions können gekapert werden - Update tw. verfügbar

Information von sabines vor 3 TagenSicherheit6 Kommentare

In bestimmten Konstellationen können Teamviewer Sessions gekapert werden, wahrscheinlich aber ein recht unwahrscheinliches Szenario. Da der Teamviewer gerne für ...

Digitiales Fernsehen

Apple TV: Amazon Prime App ist verfügbar

Information von Frank vor 4 TagenDigitiales Fernsehen4 Kommentare

Die Amazon Prime Video App kann ab sofort auf einem Apple TV ab der 3 Generation installiert werden. Einfach ...

Heiß diskutierte Inhalte
Vmware
Installation Windows 10 VMware
Frage von Ghost108Vmware17 Kommentare

Hallo zusammen, versuche gerade mit Hilfe des vshpere clients eine virtuelle Windows 10 maschine aufzusetzen. 1. virtuelle Maschine erstellt ...

Exchange Server
SBS 2011 E-Mails können gesendet werden, aber nicht von extern empfangen
Frage von andreas1234Exchange Server14 Kommentare

Hallo Community, ich habe das Problem, dass seit knapp zwei Wochen die E-Mails von meinem SBS 2011 einwandfrei gesendet ...

Voice over IP
Telefonstörung - Ortsrufnummern kein Verbindungsaufbau
Frage von Windows10GegnerVoice over IP10 Kommentare

Hallo, sowohl bei uns als auch beim Opa ist es über VoIP nicht möglich Ortsrufnummern anzurufen. Es kommt nach ...

Windows Server
Server 2012 über Eingabeaufforderung devmgmt.msc geht nicht
gelöst Frage von achim222Windows Server9 Kommentare

Hallo, ich habe hier einen Server 2012 der im Reparaturmodus startet. Es liegt an einem falschen VirtIO Treiber für ...