Entwickler-Ecke
Sonstiges (.NET) - Fehler bei dem Auswählen eines Prozesses
-CrimeTime- - So 29.07.12 11:32
Titel: Fehler bei dem Auswählen eines Prozesses
Hallo,
ich möchte mit Hilfe einer Combobox prozesse Auswählen und dann mein Programm mit diesen zu verknüpfen, ich benutze eine Funktion namens "ProcessThread" um die Combobox mit den derzeitigen PID's (Process ID's) zu füllen, und dann halt Auszuwählen.
Hier erstmal der Code dazu:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| private void ProcessThread() { while (_ProcessThread.IsAlive) { if (cbProcess.InvokeRequired) { cbProcess.Invoke((Action)(() => { var SI = cbProcess.SelectedItem; cbProcess.BeginUpdate(); cbProcess.DataSource = Process.GetProcessesByName("ProzessName").Select(p => p.Id).ToList(); cbProcess.DisplayMember = "Id"; cbProcess.ValueMember = "Id"; if (cbProcess.Items.Count > 1) { cbProcess.SelectedItem = SI; } cbProcess.EndUpdate(); })); } Thread.Sleep(500); } } |
Der hervorgegebene Bereicht gibt mir jedoch eine Fehlermeldung wieder und zwar:
Zitat: |
An den neuen Anzeigemember kann nicht gebunden werden.
Parametername: newDisplayMember. |
Ich denke mir das, dass Problem darin besteht das er keine derzeitige Prozess Id zugewiesen bekommen hat, diese wird erst später vom Benutzer in der Combobox ausgewählt und dann mit einen Buttonklick mit dem Programm verbunden.
Hoffe jemand hat für dieses Problemchen eine Lösung parat.
Christian S. - So 29.07.12 12:13
Hallo!
Das Problem erscheint mir eher, dass Du als DataSource eine Liste von Zahlen (die IDs) übergibst, dann aber eine Anzeige- und Werteigenschaft festlegen willst - Zahlen haben aber keine Eigenschaften, insbesondere hat ein int keine Eigenschaft Id.
Grüße,
Christian
-CrimeTime- - So 29.07.12 12:45
Was könnte ich den ansonsten als DisplayMember und ValueMember angeben damit ich den gewünschten Erfolg erziele?
Stehe dort im Moment echt aufm Schlauch.
Eventuell Hilft euch das ich den Prozess so deklariert habe:
C#-Quelltext
1:
| Process process = cbProcess.SelectedItem as Process; |
Christian S. - So 29.07.12 12:50
Wenn Du die Prozesse selber in die Combobox packen willst, lass das Selektieren der ID einfach weg. Dann sollte das mit dem Anzeigen auch so funktionieren. :)
-CrimeTime- - So 29.07.12 13:02
Wäre ja auch etwas zu einfach gewesen, wenn das jetzt geklappt hätte also das Programm wird nun Kompiliert, nach dem ich einen Prozess ausgewählt habe und diesen an mein Programm Anheften möchte kommt dieser Fehlermeldung:
Zitat: |
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. |
Markiert wird diese Zeile des Codes:
C#-Quelltext
1: 2:
| Process process = cbProcess.SelectedItem as Process; ObjectManager.Initialize(process.Id); |
Wobei process = Null ist.
Christian S. - So 29.07.12 13:39
Dann steht in SeletcedItem entweder null oder es ist kein Process. Setz doch mal einen Haltepunkt auf die erste Zeile des Quelltextes und lass Dir anzeigen, was in SeletcedItem drin steht.
Eventuell funkt Dir der Thread, mit dem Du Liste befüllst, da rein. Der schreibt da ja halbsekündlich Neues rein :nixweiss:
-CrimeTime- - So 29.07.12 14:26
Also wenn ich über das SelectedItem gehe bekomme ich dies:
Zitat: |
cbProcess.SelectedItem = 5796 |
Damit wird das schonmal gehen, hast du sonst noch eine Idee?
Christian S. - So 29.07.12 14:50
Ach, natürlich :autsch: Setz mal die ValueMember-Eigenschaft nicht, Du willst ja dass der Prozess selber der Wert ist und nicht nur die Id.
-CrimeTime- - So 29.07.12 14:58
Ehm ich habe eben bei der ProcessThread Funktion diese beiden raus genommen:
C#-Quelltext
1: 2:
| cbProcess.DisplayMember = "Id"; cbProcess.ValueMember = "Id"; |
dort kam der Fehler im vorherigen Post.
Nun habe ich dies wieder hinzugefügt.
C#-Quelltext
1:
| cbProcess.DisplayMember = "Id"; |
Und es besteht der selbe Fehler, bin etwas verwirrt nun.
Christian S. - So 29.07.12 15:01
Ich glaube, mit den einzelnen Code-Schnipseln kommt man hier nicht weiter. Versuche bitte mal, den relevanten Code mit etwas mehr Zusammenhang zu posten ;-)
-CrimeTime- - So 29.07.12 15:24
OK legen wir mal los:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| public void UpdateIndex(int idx) { cbProcess.Invoke((Action)(() => cbProcess.SelectedIndex = idx)); }
private void ProcessThread() { while (_ProcessThread.IsAlive) { if (cbProcess.InvokeRequired) { cbProcess.Invoke((Action)(() => { var SI = cbProcess.SelectedItem; cbProcess.BeginUpdate(); cbProcess.DataSource = Process.GetProcessesByName("ProcessName").Select(p => p.Id).ToList(); if (cbProcess.Items.Count > 1) { cbProcess.SelectedItem = SI; } cbProcess.EndUpdate(); })); } Thread.Sleep(500); } }
public Form1() { InitializeComponent(); _ProcessThread = new Thread(ProcessThread) { IsBackground = true }; _ProcessThread.Start(); } |
Dann hier noch der Button zum Anheften:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| private void button2_Click(object sender, EventArgs e) { Process process1 = cbProcess.SelectedItem as Process; var proc = Process.GetProcessesByName("ProcessName"); if (proc.Length != 0) { ObjectManager.Initialize(process1.Id); IntPtr WindowHandle;
if (ObjectManager.Initialized) { try { Base = process1.MainModule.BaseAddress; ObjectManager.Pulse();
WindowHandle = process1.MainWindowHandle;
if (ObjectMgr.Initialize(PID)) { AttachedTo = PID; isAttached = true; btnAttach.Enabled = false; } } catch { } } else { this.Text = this.Text + " NOT ATTACHED!"; } } } |
Das wären jetzt die Relevanten Code stellen, hoffe kommen nun etwas weiter.
Christian S. - So 29.07.12 15:29
Wieso ist da jetzt wieder das Select auf die ID drin? :gruebel:
-CrimeTime- - So 29.07.12 15:46
Habe es nun so gemacht
C#-Quelltext
1:
| cbProcess.DataSource = Process.GetProcessesByName("ProcessName").ToList(); |
Nur dann ist die Combobox leer.
Christian S. - So 29.07.12 16:40
Ich wette, ist sie nicht, sondern es wird für die Items nur kein Text angezeigt. Setze mal den Display-Member. ;-)
(Und bitte ein bisschen mehr Eigeninitiative :?)
//edit: Das ToList brauchst Du nicht.
-CrimeTime- - So 29.07.12 17:02
Danke scheint nun in der Form.cs zu laufen, jedoch wenn ich dies nun in einer anderen *.cs file aufrufen möchte bekomme ich wieder den Fehler das process = null ist.
Ich benutzte es in der anderen *.cs Datei so:
C#-Quelltext
1: 2:
| Form = new Form1(); Process process = Form.cbProcess.SelectedItem as Process; |
Ich habe in der Form1.Designer.cs cbProcess auf public gesetzt.
Christian S. - So 29.07.12 17:07
Du erstellst eine neue Instanz der Klasse Form1, in der hast Du ja dann nichts ausgewählt.
Das sieht mir auch nicht nach sauberer Trennung von Programmlogik und Darstellung aus. Wie genau steht die andere Klasse mit der Form1-Klasse in Beziehung?
-CrimeTime- - So 29.07.12 17:29
Die class wird als class genutzt und Funktion raus abgerufen aus der Form1.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!