मेरे जीयूआई ऐप में मैं कंसोल ऐप चलाता हूं और इसकी खिड़की के हैंडल की आवश्यकता होती है। मैंने EnumWindows() के साथ प्रयास किया, नीचे कोड देखें, लेकिन यह काम नहीं करता है। सूची में मेरा कोई कंसोल ऐप नहीं है।मेरे जीयूआई एप्लिकेशन से लॉन्च कंसोल विंडो के हैंडल कैसे प्राप्त करें?
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' के बाद' स्लीप (50) 'के साथ मेरे लिए काम करता है। – Branko
ब्रैंको, यही वह है जो मुझे पसंद नहीं है। मैं कुछ और विश्वसनीय खोजने की कोशिश करूंगा और परिणाम यहां पोस्ट करूंगा। – TLama
@TLama - मैं आपसे पूछना चाहता हूं कि आपने क्यों हटाया है, मेरे लिए अच्छा समाधान ('अटैचकंसोल (पीआईडी), GetConsoleWindow, FreeConsole')। आप कुछ एमएस के लिए 'नींद() 'के बारे में चिंता क्यों करते हैं? – Branko