편집 : 내 문제는 완전히 해결되지 않았지만 아래 답변은 흥미로운 결과를 제공했습니다.
이 앱은 결국 powershell 스크립트에 의해 호출되며이 상황에서는 아래에 설명 된 문제가 없습니다. PS 콘솔에 추가 {ENTER}가 필요하지 않으므로 더 이상 문제가 없습니다! cmd.exe를 통해 내 앱을 수동으로 시작할 때 추가 ENTER가 필요한지 신경 쓰지 않았습니다.
문제 : VB.NET 양식 앱에서 코드 실행이 완료된 후 콘솔을 "기본"상태로 되돌릴 수 없습니다. 수동으로 Enter 키를 눌러야합니다.
내 앱은 명령 줄에서도 실행할 수 있습니다 (이 경우 양식이 열리지 않습니다. 코드가 자동으로 실행되고 사용자가 어떤 일이 발생하는지 볼 수 있도록 콘솔로 출력이 전송 됨)
을 호출 AttachConsole(-1)
하고 일부 코드를 실행하고 모든 것이 완료되면 콘솔에 최신 메시지가 표시되지만 프로세스가 완전히 완료되지 않은 것 같습니다.
나는 시도했다 SendKeys.SendWait("{ENTER}")
. 잘 작동하지만 콘솔이 현재 초점 일 때만 가능합니다. 코드가 실행되는 동안 콘솔 외부를 클릭하면 활성화 된 창에 ENTER 키가 전송됩니다.
그래서 콘솔을 현재 창으로 만들려고했습니다.
Dim bProcess As Process = Process.GetProcessesByName("cmd").FirstOrDefault()
SetForegroundWindow(bProcess.MainWindowHandle)
// I also tried AppActivate(bProcess.Id)
SendKeys.SendWait("{ENTER}")
FreeConsole()
아니요, ENTER 키는 콘솔이 아닌 다른 곳으로 전송됩니다. 하지만 콘솔이 주황색으로 깜박이게해서 SetForegroundWindow
뭔가를하는 것 같습니다 ...
어떤 도움이라도 대단히 감사하겠습니다 :)
편집하다
@TnTinMn의 답변에 대한 응답 :
FreeConsole()
// SendKeys.SendWait("test")
PieceOfCodeFromTnTinMn()
지금까지했던 것과 같은 동작 : SendKeys.SendWait("~")
코드가 실행되는 동안 포커스를 잃으면 콘솔 "외부"명령 을 보냅니다 .
그러나 위의 두 번째 줄에 주석이없는 경우 "test"가 콘솔 외부 SendKeys.SendWait("~")
로 전송 되고 예상대로 콘솔 로 전송 됩니다 .
나는 아직도 여기서 무슨 일이 일어나고 있는지 알아 내려고 노력하고 있습니다 ...
를 호출하기 전에 VB Interaction.AppActivate 메서드 를 사용하여 부모 콘솔을 활성화 할 수 있습니다 SendKeys.SendWait
. 이를 위해서는 응용 프로그램의 상위 프로세스 인 콘솔 창의 ProcessID를 얻어야합니다.
이를 수행하는 한 가지 방법은 WMI (Windows Management Instrumentation)를 사용하는 것입니다. 다음은 예쁘지 않지만 작동하는 것 같습니다. 호출 후 이것을 실행할 것입니다.FreeConsole
Using currentProcess As Process = Process.GetCurrentProcess
Dim query As New SelectQuery()
Dim props As New StringCollection
props.Add("ProcessId")
props.Add("ParentProcessId")
With query
.ClassName = "Win32_Process"
.Condition = $"ProcessId={currentProcess.Id}"
.SelectedProperties = props
End With
Dim parentProcessId As Int32
Using searcher As New ManagementObjectSearcher(query)
Using mos As ManagementObjectCollection = searcher.Get
Using en As ManagementObjectCollection.ManagementObjectEnumerator = mos.GetEnumerator
If en.MoveNext() Then
parentProcessId = CInt(en.Current.Item("ParentProcessId"))
End If
End Using 'en
End Using ' mos
End Using 'searcher
If parentProcessId <> 0 Then
AppActivate(parentProcessId)
SendKeys.SendWait("~")
End If
End Using 'currentProcess
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다