Autor |
Beitrag |
-CrimeTime-
      
Beiträge: 55
|
Verfasst: So 29.07.12 11:32
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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. 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 29.07.12 14:50
Ach, natürlich  Setz mal die ValueMember-Eigenschaft nicht, Du willst ja dass der Prozess selber der Wert ist und nicht nur die Id.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: 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:
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 29.07.12 15:29
Wieso ist da jetzt wieder das Select auf die ID drin? 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: So 29.07.12 17:29
Die class wird als class genutzt und Funktion raus abgerufen aus der Form1.
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 29.07.12 19:33
Hallo -CrimeTime-,
dir scheinen aber wirklich die Grundlagen zu fehlen, um dann gleich mit Threads zu arbeiten (m.E. reicht hier auch einfach ein Timer).
Und so schwer ist DataBinding nun auch nicht (um dieses Thema unnötigerweise so in die Länge zu ziehen)...
Und auch der letzte Code zeigt besonders, daß dir Grundlagen fehlen - ich kann dir dazu nur meinen Artikel Kommunikation von 2 Forms (bzw. Forms und Klassen) empfehlen (auch wenn ich eigentlich nicht daran glaube, daß du ihn durchlesen und verstehen wirst).
Ich kann zwar verstehen, daß du schnell irgendetwas Lauffähiges erreichen möchtest, jedoch mußt du auch die Hintergründe verstehen, sonst kommst du von einem Fehler zu nächsten...
P.S. Außerdem ist dies ein Crosspost ( myCSharp.de: Anwendung benutzt nicht den ausgewählten Prozess), auch wenn der Thread dort schon - aus obigen Gründen - geschlossen wurde.
|
|