6
6
using System . Diagnostics ;
7
7
using System . IO ;
8
8
using System . Linq ;
9
+ using System . Management ;
9
10
using System . Text ;
10
11
using System . Threading . Tasks ;
11
12
using System . Windows ;
@@ -35,10 +36,12 @@ public partial class MainWindow : Window
35
36
36
37
private BackgroundTerminalSettings _settings ;
37
38
38
- private Process _cmdProcess ;
39
+ private Process _process ;
39
40
40
41
private ObservableCollection < string > _terminalData = new ObservableCollection < string > ( ) ;
41
42
43
+ private int _cmdProcessId ;
44
+
42
45
private bool _terminalWindowActive = false ;
43
46
44
47
private bool _awaitingKey1 = false ;
@@ -52,7 +55,7 @@ public MainWindow()
52
55
InitializeComponent ( ) ;
53
56
54
57
// Create TerminalWindow
55
- _terminalWindow = new TerminalWindow ( SendCommand ) ;
58
+ _terminalWindow = new TerminalWindow ( SendCommand , KillChildren ) ;
56
59
_terminalWindow . Show ( ) ;
57
60
58
61
// Apply changes in terminal data to TerminalWindow
@@ -136,34 +139,51 @@ private void ApplySettingsToTerminalWindow()
136
139
_terminalWindow . UpdateTerminalDataTextBoxMargin ( ) ;
137
140
}
138
141
142
+ private List < Process > GetProcessChildren ( )
143
+ {
144
+ List < Process > children = new List < Process > ( ) ;
145
+ ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher ( String . Format ( "Select * From Win32_Process Where ParentProcessID={0}" , _process . Id ) ) ;
146
+
147
+ foreach ( ManagementObject managementObject in managementObjectSearcher . Get ( ) )
148
+ {
149
+ children . Add ( Process . GetProcessById ( Convert . ToInt32 ( managementObject [ "ProcessID" ] ) ) ) ;
150
+ }
151
+
152
+ return children ;
153
+ }
154
+
139
155
#region Terminal Data Handlers
140
156
private async Task < int > RunTerminalProcessAsync ( )
141
157
{
142
158
TaskCompletionSource < int > taskCompletionSource = new TaskCompletionSource < int > ( ) ;
143
159
144
- _cmdProcess = new Process ( ) ;
160
+ _process = new Process ( ) ;
145
161
146
- _cmdProcess . StartInfo . FileName = "cmd.exe" ;
147
- _cmdProcess . StartInfo . WorkingDirectory = Environment . GetFolderPath ( Environment . SpecialFolder . MyDocuments ) ;
148
- _cmdProcess . StartInfo . UseShellExecute = false ;
149
- _cmdProcess . StartInfo . CreateNoWindow = true ;
150
- _cmdProcess . StartInfo . RedirectStandardInput = true ;
151
- _cmdProcess . StartInfo . RedirectStandardOutput = true ;
152
- _cmdProcess . StartInfo . RedirectStandardError = true ;
162
+ _process . StartInfo . FileName = "cmd.exe" ;
163
+ _process . StartInfo . WorkingDirectory = Environment . GetFolderPath ( Environment . SpecialFolder . MyDocuments ) ;
164
+ _process . StartInfo . UseShellExecute = false ;
165
+ _process . StartInfo . CreateNoWindow = true ;
166
+ _process . StartInfo . RedirectStandardInput = true ;
167
+ _process . StartInfo . RedirectStandardOutput = true ;
168
+ _process . StartInfo . RedirectStandardError = true ;
153
169
154
- _cmdProcess . EnableRaisingEvents = true ;
155
- _cmdProcess . OutputDataReceived += CMD_OutputDataReceived ;
156
- _cmdProcess . ErrorDataReceived += CMD_ErrorDataReceived ;
170
+ _process . EnableRaisingEvents = true ;
171
+ _process . OutputDataReceived += CMD_OutputDataReceived ;
172
+ _process . ErrorDataReceived += CMD_ErrorDataReceived ;
157
173
158
- _cmdProcess . Exited += new EventHandler ( ( sender , args ) =>
174
+ _process . Exited += new EventHandler ( ( sender , args ) =>
159
175
{
160
- taskCompletionSource . SetResult ( _cmdProcess . ExitCode ) ;
161
- _cmdProcess . Dispose ( ) ;
176
+ taskCompletionSource . SetResult ( _process . ExitCode ) ;
177
+ _process . Dispose ( ) ;
162
178
} ) ;
163
179
164
- _cmdProcess . Start ( ) ;
165
- _cmdProcess . BeginOutputReadLine ( ) ;
166
- _cmdProcess . BeginErrorReadLine ( ) ;
180
+ _process . Start ( ) ;
181
+ _process . BeginOutputReadLine ( ) ;
182
+ _process . BeginErrorReadLine ( ) ;
183
+
184
+ List < Process > children = GetProcessChildren ( ) ;
185
+ if ( children . Count > 0 )
186
+ _cmdProcessId = children [ 0 ] . Id ;
167
187
168
188
return await taskCompletionSource . Task ;
169
189
}
@@ -178,10 +198,25 @@ private void CMD_ErrorDataReceived(object sender, DataReceivedEventArgs e)
178
198
_terminalData . Add ( e . Data ) ;
179
199
}
180
200
181
- private void SendCommand ( string command )
201
+ private void SendCommand ( string command , bool output = true )
182
202
{
183
- _terminalData . Add ( command ) ;
184
- _cmdProcess . StandardInput . WriteLine ( command ) ;
203
+ if ( output )
204
+ _terminalData . Add ( command ) ;
205
+
206
+ _process . StandardInput . WriteLine ( command ) ;
207
+ }
208
+
209
+ private void KillChildren ( )
210
+ {
211
+ List < Process > children = GetProcessChildren ( ) ;
212
+
213
+ foreach ( Process child in children )
214
+ {
215
+ if ( ! child . Id . Equals ( _cmdProcessId ) )
216
+ {
217
+ child . Kill ( ) ;
218
+ }
219
+ }
185
220
}
186
221
#endregion
187
222
0 commit comments