Laden...

Forenbeiträge von Akhanto Ingesamt 28 Beiträge

10.04.2015 - 20:10 Uhr

Oh ja, natürlich. Auch wenn das Problem letztendlich eine Eigenproduktion war. Vielleicht dient es ja als Lehrbeispiel für Anfänger.

Das Problem lag hier, im Nachhinein wohl extremst ungeschickt gelöst.

        public IList<t_members> GetAllMembers()
        {
            IList<t_members> tempMembersList = _membersRepository.GetAll();
            //foreach (t_members m in tempMembersList)
            //{
            //    m.IsTrial = true && GetTrialmemberById(m.P_member_ID) != null;
            //    if (GetTrialmemberById(m.P_member_ID) != null)
            //        m.Notes = GetTrialmemberById(m.P_member_ID).note;
            //}
            return tempMembersList;
        }

Genauer gesagt war es die foreach Schleife.

Vielen Dank für die Hilfe, der Leistungstest war mir neu.

10.04.2015 - 16:50 Uhr

Dankeschön!!!
Ich hab's gefunden.

10.04.2015 - 15:20 Uhr

Anbei ein Screenshot der Abfrage. Das sieht alles ziemlich zeitintensiv aus.
Jemand ne Idee?
Abt hast du ein besseres Beispiel dafür?

Liebe Grüße
Akhanto

10.04.2015 - 14:17 Uhr

Hab zum Test einen Button eingefügt, mit dem ich die IList neu lade und dann das Grid, dauert genau so lange.

10.04.2015 - 13:46 Uhr

verwendetes Datenbanksystem: EF 6 + MySQL

Hi,
der Versuch, ca. 120 Datensätze mithilfe von EF aus einer MySQL Datenbank abzufragen war leider sehr frustrierend. Es dauert über 15 Sekunden, bis die Abfrage fertig ist.

Ist das ein generelles Problem dieser Kombination oder liegt es eher an der Abfrage?

Ich habe mich an dieses Tutorial gehalten, um das Programm zu erstellen.

Daher dieser Code zur Abfrage:

        public virtual IList<T> GetAll(params Expression<Func<  T, object >>[] navigationProperties)
        {
            List<T> list;
            using (var context = new ClanDBEntities(Helper.ConnectionStringBuilder.DefaultBuilder()))
            {
                IQueryable<T> dbQuery = context.Set<T>();

                //Apply eager loading
                foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
                    dbQuery = dbQuery.Include<T, object>(navigationProperty);

                list = dbQuery
                    .AsNoTracking()
                    .ToList<T>();
            }
            return list;
            
        }

Die Zeile im Code, die dann hängt ist diese hier:

            IList<t_members> memList = businessLayer.GetAllMembers();

Vielen dank schon mal,
Akhanto

06.12.2013 - 23:17 Uhr

Vielen Dank @Abt. Ich denke, das ist genau, was ich suche!

@Lennart: Die Spotify API wollte ich nicht nutzen, weil ich das Programm ja vielleicht auch mal für andere Anwendungen nutzen will...

03.12.2013 - 23:42 Uhr

Der "Umweg" über die Simulation von Tasten war mir zwar von vorn herein irgendwie nicht ganz recht, ich hab es aber dennoch probiert und bin gescheitert.

Ein einfaches Windows Forms Testprogramm mit einem Button und einem

SendKeys.SendWait("MediaPlayPause");

reagiert nicht.

Auch ein, wie es im Beispiel der MSDN Doku stand:

SendKeys.SendWait("{MediaPlayPause}");

läuft nicht.

Ich bin mir aber auch irgendwie sicher, dass es da etwas "direkteres" und systemnäheres gibt, ich finde es schlicht und einfach nicht...

Trotzdem Danke für den Tip und für alle weiteren Hilfen!

03.12.2013 - 19:36 Uhr

Hi,
ich suche momentan vergeblich nach einer Möglichkeit einen Play/Pause/Stopp/Weiter Befehl an ein Musikprogramm zu senden.
Hintergrund ist, dass es bei Spotify nicht möglich ist, einen Autoplay einzustellen und ich würde es gerne morgens als eine Art Wecker nutzen.
Ich möchte einfach ein kleines Programm schreiben, dass bei Aufruf ein Play sendet (wie, wenn man auf der Tastatur auf den Play Knopf drückt).

Meine Suche nach Begriffen, wie "Mediensteuerung" oder "Musik steuern" haben lediglich auf DLNA, abspielen von MP3s oder die Steuerung vom Windows Media Player hingewiesen, das hilft aber eben nicht... Wenn es möglich ist, mit einer Tastatur zu steuern, muss es doch mit C#/API möglich sein.

Vielen Dank
Akhanto

03.08.2013 - 17:39 Uhr

Danke für die Ratschläge, ich hab das jetzt soweit verstanden.

Die Probleme, die noch aufgetreten sind, werde ich in anderen Themen erfragen bzw. mich eben erstmal selber schlau machen.

27.07.2013 - 22:44 Uhr

Hi,
danke für die Erklärung irgendwie gewöhnungsbedürftig, evtl stelle ich mich auch etwas doof an..

Gibt es eine kleine Übersicht, wie man bestimmte Beziehungen korrekt in EF Code abbildet? Ich kenne die GetStarted Seite von Microsoft, aber da habe ich sowas nicht gefunden. Da ich im Urlaub bin, habe ich nur gedrosseltes Handyinternet, was das suchen etwas schwer macht.
Falls da jemand was zur Hand hat, wäre das super, ansonsten suche ich mir selber was, wenn ich wieder zu Hause bin.

Vielen Dank
Akhanto

24.07.2013 - 23:41 Uhr

Hi,
erstmal vielen Dank für die Hilfe.

Wahrscheinlich habe ich einen weiteren Denkfehler, aber ich verstehe deine Darstellung der Beziehungen nicht so ganz.

Es ist doch eigentlich so, dass

  1. ein Benutzer viele Rechte hat.

  2. ein Recht nicht direkt Benutzern zugordnet wird (oder?)

  3. eine Gruppe viele Rechte hat.

  4. Ein Recht auch nicht direkt Gruppen zugeordnet wird.

So wie das in meiner Logik aussieht, sind das doch 1:n Beziehungen oder nicht?

LG
Akhanto

24.07.2013 - 13:51 Uhr

Ich mache Code First und habe mangels Erfahrung erwartet, dass man das aus dem Post erschließen kann, sry.

Das Modell ist wie gesagt erstmal nur Spielwiese ohne Achten auf irgendwelche Sicherheitsregeln oder so, deshalb mache ich mir auch keine Mühe die Passwörter zu verschlüsseln und so weiter.

Ich benutze Visual Studio 2012 Ultimate, das Diagramm habe ich mir aus dem SQL Explorer erstellen lassen.

Dass die Logik soweit richtig sein sollte, ist ja schonmal super, aber wo liegt dann der Fehler? Denn so wie das jetzt ist, kann das ja nicht funktionieren oder?
Mir ist aufgefallen, dass es Bei Benutzer und Recht ähnlich ist. Vom Diagramm her scheint er davon aus zu gehen, dass ein Recht einen Benutzer enthält, obwohl ein Benutzer ja eigentlich eine Liste von Rechten bekommen soll.
Irgendwo muss dort ein logischer Fehler sein, der das ganze nach links dreht..

Vielen Dank

24.07.2013 - 12:31 Uhr

verwendetes Datenbanksystem: <SQLEXPRESS / EntityFramework>

Hallo,
ich versuche mich momentan an EF. Der erste Einstieg ist relativ leicht gefallen (die ersten CRUD Experimente usw.)
Als Spielplatz habe ich mir eine simple Rechteverwaltung gebastelt (das Modell davon).

Es beinhaltet Recht, Gruppe und Benutzer.

Das Recht hat eine ID, einen Namen und eine Kategorie.

Die Gruppe hat eine ID, einen Namen, eine andere Gruppe (vererbung) und eine ICollection, die Recht(e) beinhaltet.

Der Benutzer hat eine ID, einen Benutzernamen, ein Passwort, den LetztenLogin (DateTime), eine ICollection Gruppen und eine ICollection Rechte.


Recht: 

        public int RightId { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }


Gruppe: 

        public int GroupId { get; set; }
        public string Name { get; set; }
        public virtual Group Inherits { get; set; }
        public virtual ICollection<Right> Right { get; set; }


Benutzer: 

        public int UserId { get; set; }
        public string Username{ get; set; }
        public string Password{ get; set; }
        public DateTime LastLogin{ get; set; }
        public virtual ICollection<Group> Groups{ get; set; }
        public virtual ICollection<Right> Rights{ get; set; }

Wenn ich das so erstelle, erhalte ich das was im Anhang zu sehen ist. Mir kommt es so vor, als wäre dort die Beziehung von Groups und Rights "falsch rum". Denn ich möchte ja eigentlich beim erstellen einer Gruppe einstellen, welche Rechte sie hat und nicht beim Erstellen eines Rechts einstellen, zu welchen Gruppen es gehört.
Habe ich einen Denkfehler oder einen Fehler im Modell?

Noch eine kurze Frage nebenbei: Warum ist es eigentlich nötig, alle Properties wo andere Objekte enthalten sind, als virtual zu deklarieren? Ich habe das aus dem hier so übernommen, aber keine Erklärung gefunden.

Vielen Dank
Akhanto

05.08.2012 - 12:14 Uhr

Guten Tag,
ich habe mich vor ein paar Tagen mit dem MVVM Modell beschäftigt, leider war das ganze nur in Tutorialform zum nachbauen. Dadurch wurde das natürlich nur sehr oberflächlich behandelt und hat bei mir einige Fragen zum Design aufgeworfen.

Das Prinzip von MVVM ist ja, wenn ich es richtig verstanden habe, Code und Design bzw. Anzeige und Verarbeitung voneinander zu trennen.

Wie sollte ich nun aber vorgehen, wenn ich z.B. eine Updaterfunktion implementieren möchte. Diese muss doch ins MainWindow oder in irgendein anderes Fenster, damit entsprechende Methoden bei Aufruf und möglichst VOR Durchführung von anderen Aufgaben ausgeführt werden.

Wie implementiert man Konfigurationsmöglichkeiten? Muss man hierfür auch ein Objektmodell und entsprechende Viewmodels etc. aufbauen?

Wie gehe ich vor, wenn eine Checkbox an bestimmte Felder (z.B. Bools) "gebunden" ist, wenn man keine Ereignisbehandlungen benutzen soll/darf/will.

Und abschließend: gibt es eine gute, detailliertere Einführung in dieses Thema im Internet zu finden? Sicher.. Es gibt einige, aber vielleicht gibt es ja die eine oder andere empfehlenswerte.

So das waren jetzt ganz schön viele Fragen, ich danke schonmal im voraus.
Akhanto

19.07.2012 - 01:26 Uhr

verwendetes Datenbanksystem: Access

Hi,
ich versuche momentan über einen von VS generierten TableAdapter einen Insertbefehl auszuführen (welcher ja auch generiert wird).

Der Aufruf sieht so aus:


dokumenteTabDataSet1tblBuchTableAdapter.Insert(tbTitel.Text, tbAutor.Text, tbBemerkungen.Text, cbDokTyp.SelectedValue, cbStandort.SelectedValue, cBQMHGliederung.SelectedValue, LstFreieNummer[0], cbAktuell.IsChecked, cbFreigegeben.IsChecked, tbVersion.Text, tbID.Text, tbQMTyp.Text, DPFreigabe.SelectedDate, tbPfad.Text);

wenn ich das ganze dann ausführen lasse, bekomme ich den im Titel stehenden Fehler: > Fehlermeldung:

Die Methode oder der Vorgang sind nicht implementiert

Daraufhin bin ich dann sicher gegangen, dass diese implementiert sind und wie in einer msdn hilfe stand, die GenerateDBDirectMethods Property auf True steht. Beides ist der Fall.

Der von VS generierte InsertCommand sieht so aus:

INSERT INTO `tblBuch` (`strBuTitel`, `strBuAutor`, `strBuBemerkungen`, `lngBuDokumenttypFK`, `lngBuStandortFK`, `lngBuQMHGliederungFK`, `lngBuDokumentnummer`, `ysnBuAktuell`, `ysnBuFreigegeben`, `strBuVersion`, `strBuID`, `strBuQMTyp`, `dtmBuFreigabe`, `strBuDateipfad`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Hat hier jemand einen Tipp für mich? Die direkte Suche nach der Fehlermeldung hat mich leider kein Stück weiter gebracht..
vielen Dank
Akhanto

PS: Der Debugger zeigt mir keine Fehler an und mir wurde alles genau so vom IntelliSense vorgeschlagen!

11.07.2012 - 10:40 Uhr

Ja.. Warum so kompliziert? Keine Ahnung!
Das wars jedenfalls, jetzt geht es!! Vielen Vielen Dank.

Wenn mir jetzt noch jemand verrät wie ich auf auf eine andere Spalte des markierten Werts zugreifen kann, bin ich komplett glücklich!

In der Tabelle sind nämlich einmal eine ID (Primary Key) und dann unter anderen eben noch der echte Name. Angezeigt wird natürlich der Name, ich brauche jedoch zur weiteren Verarbeitung die ID. Mit SelectedValue bekomme ich ja nur den Namen, was benutze ich stattdessen?

//Edit: Problem gelöst.. Man muss einfach den DisplayMemberPath anpassen!

vielen Dank
Akhanto

11.07.2012 - 09:59 Uhr

Ich wusste doch ich hab was vergessen..

    <Window.Resources>
        <ObjectDataProvider
        x:Key="TypProvider"
        MethodName="DataSetFüllenDokTypMDB"
        ObjectType="{x:Type local:DataSets}"/>
    </Window.Resources>

Das Problem mit der fehlenden Anzeige hat sich gelöst.. ich habe mich an das gehalten und jetzt gehts.

Wenn mir jetzt noch jemand verrät wie ich auf auf eine andere Spalte des markierten Werts zugreifen kann, bin ich komplett glücklich!

In der Tabelle sind nämlich einmal eine ID (Primary Key) und dann unter anderen eben noch der echte Name. Angezeigt wird natürlich der Name, ich brauche jedoch zur weiteren Verarbeitung die ID. Mit SelectedValue bekomme ich ja nur den Namen, was benutze ich stattdessen?

Die Frage habe ich in diesem Beitrag bereits gestellt, da sich der aber eigentlich auch was anderes bezieht, habe ich das hier nochmal gestellt.

//Edit: Problem gelöst.. Man muss einfach den DisplayMemberPath anpassen!

vielen Dank
Akhanto

10.07.2012 - 22:13 Uhr

Hallo zusammen,
ich versuche momentan verzweifelt mich in WPF und die Datenbindung einzuarbeiten.
Ziel ist es eine Combobox an den Inhalt eines DataSets zu binden. Obwohl ich keine Fehlermeldung bekomme, wird die Box leider nicht gefüllt.

Als Orientierung habe ich mich an diese Anleitung gehalten: Hier

Die Methode für das DataSet sieht so aus:

        public static DataSet DataSetFüllenDokTypMDB()
        {
            OleDbConnection con = new OleDbConnection(
                @"Provider=Microsoft.Jet.OLEDB.4.0;
     Data Source=C:\Users\Tim\Desktop\DokumenteTab.mdb");
            string cmd = "SELECT tblBuchDokumenttyp.lngBuchDokumenttypPK, tblBuchDokumenttyp.strDtName AS Dt, tblBuchDokumenttyp.strDtKürzel, tblBuchDokumenttyp.strDtQMTyp, [strDtQMTyp] & \" - \" & [strDtName] AS Dt2 FROM tblBuchDokumenttyp ORDER BY [strDtQMTyp]";
            OleDbCommand comm = new OleDbCommand(cmd, con);

            OleDbDataAdapter adapter = new OleDbDataAdapter(comm);

            DataSet ds = new DataSet();
            adapter.Fill(ds);
            return ds;
        }

Der Code der Box:

<ComboBox DataContext="{StaticResource TypProvider}" ItemsSource="{Binding tblBuchDokumenttyp}" Grid.Column="1" Height="23" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" Width="120"/>

Kann mir jemand einen Tip geben, das besser zu machen?

vielen Dank
Akhanto

10.07.2012 - 21:58 Uhr

Guter Hinweis!
Der Fehler an sich ist gelöst.. es war ein fehlender/defekter Treiber für die aktuellen Accessdatenbanken.

Leider kriege ich es noch nicht hin die Combobox mit einem DataSet zu verbinden, aber das ist wohl ein anderes/neues Thema.

vielen Dank euch!

Akhanto

10.07.2012 - 15:01 Uhr

Das mit dem neu bauen war ein guter Hinweis. Ich bekomme jetzt jedenfalls einen richtigen Fehler im Debugger angezeigt, der mir jedoch kein Stück weiterhilft:

Fehlermeldung:
Exception has been thrown by the target of an invocation

Alles befindet sich im gleichen Projekt.

vielen Dank
Akhanto

09.07.2012 - 22:30 Uhr

Danke die beiden Themen sind schonmal sehr vielversprechend!

Ich suche beides. Einmal ein Nachschlagwerk mit wichtigen Dingen über Postgres und dann ein Buch über generelle Sachen in Sachen Datenbankarchitektur sowie Programmierung von mehrschichtigen Programmen.

09.07.2012 - 22:25 Uhr

Hi,
ich bin an dem Versuch, eine Combobox an ein Dataset zu binden gescheitert.

Ich habe mich an dieses tutorial gehalten.

Der XAML Code sieht so aus:

<Window x:Class="Dateiverwaltung.NeueDateien"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Dateiverwaltung"
        Title="NeueDateien" Height="388" Width="851">
    <Window.Resources>
        <ObjectDataProvider
        x:Key="TypProvider"
        ObjectType="{x:Type local:DataSets}"
        MethodName="DataSetFüllen"/>
    </Window.Resources>

Beim ObjectType zeigt er mir: > Fehlermeldung:

Type 'local:DataSets' was not found

an.

Was mache ich falsch? ich habe nirgends einen ähnlichen Fehler gefunden und zerbreche mir seit gestern den Kopf..

vielen Dank
Akhanto

06.07.2012 - 16:34 Uhr

verwendetes Datenbanksystem: Postgres

Hallo,
ich suche Literatur (auch online) zu datenbankunabhängiger mehrschichtiger Programmarchitektur und zu Datenbankarchitektur.Ich suche schon ewig im Internet und in Buchhandlungen, habe jedoch nichts gutes gefunden. Kann mir hier jemand gute, tiefer gehende Sachen zu dem Thema und zu Sicherheit und Mehranwenderfreundlichkeit empfehlen?
Vielen Dank
Akhanto

25.04.2012 - 21:47 Uhr

Hi,
in einer Anwendung lasse ich in einem Thread Dateien kopieren. Immer wenn eine Datei kopiert wurde, wird ein Event gefeuert. Im Programm fange ich die ab und will damit einen Fortschrittsbalken aktualisieren (Zugriff auf zwei int Properties in der kopierenden Klasse).

In WPF ist es ja nun so, dass man Steuerelemente nur aus dem gleichen Thread heraus verändern kann. Da ich jedoch das Ereignis im MainWindow abfange und das Steuerelement eigentlich auch dort erstellt wird, erschließt sich mir mein folgendes Problem nicht.

Immer wenn er eine Datei fertig hat (also quasi sofort nach dem Start), wirft er eine Exception: > Fehlermeldung:

Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet.

kopierschleife:

                    foreach (FileInfo fi in Dateien)
                    {
                        if (!File.Exists(strPfad + strOrdnername + fi.Name))
                        {

                            intZahlDateienAktuell++;
                            intZahlDateienRest--;
                            intProzent = intZahlDateienAktuell / intZahlDateien * 100;
                            System.IO.File.Copy((Convert.ToString(fi.FullName)), strPfad + strOrdnername + fi.Name, true);

                            OnDateiKopiert(EventArgs.Empty);
                            
                        }
                    }

Ereignisbehandlung:


        private void objDA_DateiKopiert(Object objSender, EventArgs e)
        {
            progBarFortschritt.Value = objDA.propProzent;
        }

Ich habe irgendwie das Gefühl, dass ich hier nen logischen Denkfehler habe, aber ich komme einfach nicht dahinter.

vielen Dank
Akhanto

15.04.2012 - 18:55 Uhr

Hallo,
ich möchte für mein Programm eine Fortschrittsleiste einbauen, die anzeigt wie weit es mit dem Kopieren von bestimmten Dateien ist. Hierfür habe ich in einer Kopieren-Klasse zwei Eigenschaften (int ZahlDateienGesamt und int ZahlDateienRest) erstellt und wollte dann im Hauptprogramm den Prozentwert ausrechnen und in den progrBar.Value übertragen. Bei meiner ersten Lösung hat er die GUI aktualisierung erst vorgenommen, als er komplett fertig war. Dann habe ich die Methode zum Kopieren in einen Hintergrundthread geschoben und versucht über eine while(Rest !=0) Schleife den Balken zu aktualisieren, jedoch passiert in diesem Fall gar nichts. Ich sitze mittlerweile den ganzen Tag an dem Problem und weder Google noch Bücher noch Bekannte konnten da sinnvoll weiterhelfen.


{
            objDA = new DateiAktionen(e.Drive);
            objDA.propStrPfad = strPfad;

            ThreadStart ThrStKopieren = new ThreadStart(objDA.Kopieren);
            Thread ThrKopieren = new Thread(ThrStKopieren);
            ThrKopieren.IsBackground = true;
            ThrKopieren.Start();

            while (objDA.propZahlDateienRest != 0)
            {
                progBarFortschritt.Value = objDA.propProzent;
            }
}

Das ist übrigens die Methode zum Kopieren:

        
public void Kopieren()
        {
        try
            {
                strOrdnername = "\\" + Microsoft.VisualBasic.Interaction.InputBox("USB-Stick gefunden! Bitte Ordnername eingeben!", "Ordnername") + "\\";
                
                if (!Directory.Exists(strPfad + strOrdnername))
                    Directory.CreateDirectory(strPfad + strOrdnername);

                if (boolDateienVorhanden)
                {
                    foreach (FileInfo fi in Dateien)
                    {
                        if(! File.Exists(strPfad + strOrdnername + fi.Name))
                        {

                            intZahlDateienAktuell++;
                            intZahlDateienRest--;
                            intProzent = intZahlDateienAktuell / intZahlDateien * 100;
                            System.IO.File.Copy((Convert.ToString(fi.FullName)), strPfad + strOrdnername + fi.Name, true);

                        }
                    }
                }
                else
                 System.Windows.MessageBox.Show("keine Dateien");
            }
            catch (Exception x)
            {
                System.Windows.MessageBox.Show(x.Message);
            }
        }

Hat hier jemand einen Tipp?

vielen dank
Akhanto

04.04.2012 - 16:08 Uhr

Stimmt. Ich werde mir das nochmal genauer ansehen!

Danke soweit

Akhanto

04.04.2012 - 15:48 Uhr

Wie geschrieben funktioniert die Erkennung mittlerweile. Meine Version ist auch ganz gut glaube ich. Mein Problem ist leider jedoch immernoch, dass es nötig wäre, dass der Laufwerkbuchstabe von dem gerade angesteckten Gerät übermittelt wird. mit der DriveInfo Klasse hilft mir hier jedoch nur begrenzt, da ich entweder speziell ein Laufwerk abfragen kann oder alle, aber nicht das, was zuletzt geändert bzw. hinzugefügt wurde.

Wird der Laufwerksbuchstabe bei Devicechange mit übermittelt oder habt ihr nen andern Ansatz für mich?

Danke
Akhanto

04.04.2012 - 11:59 Uhr

Hi,
Neu hier und schon ne Frage =)
Ich suche seit gestern nach einer Möglichkeit einen angesteckten USB Stick zu erkennen und darauf zu reagieren (in meinem Fall bestimmte Daten automatisch runter kopieren). WndProc gibt es ja in WPF nicht.
Bei meiner Suche habe ich das, sowie das

beides kombiniert sieht das bei mir so aus:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Interop;

namespace USB_Stick
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        USBerkennung objCD = new USBerkennung(); 
        const int WM_DEVICECHANGE = 0x219;
        int intUSBCount;

        public MainWindow()
        {
            InitializeComponent();
            CheckDrives();
        }

        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
            source.AddHook(WndProc);
        }

        private void CheckDrives()
        {
            intUSBCount = 0;
            foreach (System.IO.DriveInfo d in System.IO.DriveInfo.GetDrives())
            {
                if (d.DriveType == System.IO.DriveType.Removable)
                    intUSBCount++;
            }
        }

        IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (msg == WM_DEVICECHANGE)
            {
                int intOldUSBCount = intUSBCount;
                CheckDrives();
                if (intUSBCount > intOldUSBCount)
                    tbStatus.Text = "Gerät gefunden";
                if (intUSBCount < intOldUSBCount)
                    tbStatus.Text = "Gerät entfernt";
            }
            return IntPtr.Zero;
        }

    }
}

Wenn ein Gerät eingesteckt wurde, soll in eine Textbox eine entsprechende Meldung geschrieben werden. Leider passiert das nicht. Kann mir da jemand weiter helfen? Eine Fehlermeldung wird mir nicht angezeigt. Ist eventuell der msg Code falsch? Der bezieht sich ja auf WndProc.

EDIT: Nach Zugabe einer weiteren Textbox, die die Anzahl der Geräte anzeigt funktioniert nun das ganze Programm! Problem gelöst. Nun stehe ich jedoch vor einem anderen Problem: Wie erkenne ich Name und Pfad des Geräts? (ich möchte ja Dateien kopieren)

vielen Dank
Akhanto