내 GUI 응용 프로그램에서 콘솔 응용 프로그램을 실행하고 해당 창 핸들이 필요합니다. EnumWindows()를 사용해 보았습니다. 아래 코드를 참고하십시오. 그러나 작동하지 않습니다. 목록에 내 콘솔 앱이 없습니다.내 GUI 응용 프로그램에서 시작한 콘솔 창 핸들을 얻는 방법?
type
TEnumWindowsData = record
ProcessId: Cardinal;
WinHandle: THandle;
List: TStrings; // For test only
end;
PEnumWindowsData = ^TEnumWindowsData;
function FindWindow(hWnd: THandle; lParam: LPARAM): BOOL; stdcall;
var
ParamData: TEnumWindowsData;
ProcessId: Cardinal;
WinTitle: array[0..200] of Char; // For test only
begin
ParamData := PEnumWindowsData(lParam)^;
GetWindowThreadProcessId(hWnd, ProcessId);
if ProcessId <> ParamData.ProcessId then
Result := True
else begin
ParamData.WinHandle := hWnd;
Result := False;
end;
// For test only
GetWindowText(hWnd, WinTitle, Length(WinTitle) - 1);
ParamData.List.Add(IntToStr(ProcessId) + ' ' + IntToStr(hWnd) + ' ' + WinTitle);
end;
procedure TForm1.Button1Click(Sender: TObject);
function RunApp(const AProgram: string): Cardinal;
var
StartupInfo: TStartupInfo;
ProcessInformation: TProcessInformation;
begin
Result := 0;
...
if CreateProcess(nil, PChar(AProgram), nil, nil, False,
NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInformation)
then
Result := ProcessInformation.dwProcessId;
...
end;
var
ParamData: TEnumWindowsData;
begin
ParamData.ProcessId := RunApp('cmd.exe /C D:\TMP\TEST.exe');
ParamData.WinHandle := 0;
ParamData.List := Memo1.Lines;
EnumWindows(@FindWindow, THandle(@ParamData));
FWindowHandle := ParamData.WinHandle;
end;
@Tlama - 감사합니다. 'CreateProcess' 다음에'Sleep (50)'과 함께 작동합니다. – Branko
Branko, 그건 내가 싫어하는거야. 더 신뢰할만한 것을 찾고 여기에 결과를 게시하려고 노력할 것입니다. – TLama
@traama - 나는 왜 좋은 해결책 (AttachConsole (PID), GetConsoleWindow, FreeConsole)을 삭제했는지 묻고 싶다. 몇 ms 동안 '수면 (sleep)'에 대해 왜 걱정합니까? – Branko