Текущий архив: 2004.09.12;
Скачать: CL | DM;
Вниз
узнать hwnd Найти похожие ветки
← →
RaPToR_1 (2004-08-30 02:00) [0]i:=winexec("notepad.exe",1);
как мне узнать хендл окна, которое я запустил?
findwindow не канает для меня в этом случаи...нужен другой способ
← →
GuAV © (2004-08-30 02:11) [1]CreateProcess
EnumThreadWindows
← →
RaPToR_1 (2004-08-30 02:19) [2]а поподробнее?
← →
GuAV © (2004-08-30 03:19) [3]CreateProcess запустит приложение заместо winexec.
в lpProcessInformation будет информация о процессе и потоке
в частности hProcess и ThreadId.
ждешь, когда он закончит инициализацию
WaitForInputIdle.
ThreadId передашешь в EnumThreadWindows - она найдёт окно.
← →
_sulent © (2004-08-30 09:16) [4]
var
...
pc: pChar;
pi: TProcessInformation;
si: TStarupInfo;
begin
...
pc := "Что екзекать";
CreateProcess(nil, pc, nil,nil, false, CREATE_DEFAULT_ERROR_MODE,nil,nil,si,pi);
WaitForSingleObject(pi.hProcess, INFINITE);
...
end;
← →
GuAV © (2004-08-30 10:50) [5]_sulent © (30.08.04 09:16) [4]
Не то. Читай внимательно вопрос. В [3] я уже дал ответ, осталось только его в код перевести.
← →
RaPToR_1 (2004-08-30 11:41) [6]
function zxc(lhwn,lparam:integer):integer;
begin
form1.Caption:=inttostr(lhwn);
//////
result:=1;
end;
function okno:string;
var
Rlst: LongBool;
StartUpInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0);
with StartUpInfo do
begin
cb := SizeOf(TStartUpInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
wShowWindow := SW_SHOWNORMAL;
end;
Rlst := CreateProcess("c:\windows\calc.exe", "", nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo);
if Rlst then
with ProcessInfo do begin
WaitForInputIdle(hProcess, INFINITE);
EnumThreadWindows(ProcessInfo.hThread,@zxc,1);
CloseHandle(hThread);
CloseHandle(hProcess);
end;
end;
не работает это
← →
MetalFan © (2004-08-30 12:38) [7]EnumThreadWindows(ProcessInfo.dwThreadId,@zxc,1);
← →
RaPToR_1 (2004-08-30 12:51) [8]
function zxc(lhwn,lparam:integer):integer;
var ii:integer;
s:string;
begin
ii := GetWindowTextLength(lhwn);
s:="";
setlength(s,ii+1);
ii := GetWindowText(lhwn, pchar(s), ii+1);
form1.Caption:=s;
//////
result:=1;
end;
вот тут я получаю хендл, но почему я не могу получить заголовок окна?
← →
KADAN © (2004-08-30 12:57) [9]может stdcall
← →
RaPToR_1 (2004-08-30 13:15) [10]даже если так я получай например у окна калькулятора капшен calcmsgpumpwnd
что эт такое?
function zxc(lhwn,lparam:integer):integer;stdcall;
var ii:integer;
s:string;
begin
ii := GetWindowTextLength(lhwn);
s:="";
setlength(s,ii+1);
ii := GetWindowText(lhwn, pchar(s), ii+1);
form1.Caption:=s;
//////
result:=1;
end;
← →
GuAV © (2004-08-30 14:12) [11]
> что эт такое?
То что окон больше одного.
Глянь в WinSight, сам увидишь.
Так попробуй.
function EnumThreadWndProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
CalcClass = "SciCalc";
CalcClassStr: array[0..Length(CalcClass)] of Char = CalcClass;
var
ClassStr: array[0..Length(CalcClass)] of Char;
begin
GetClassName(hWnd,ClassStr,Length(CalcClass)+1);
Result:=ClassStr <> CalcClassStr;
if not Result then PHandle(lParam)^:=hWnd;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Wnd: HWND;
SI: TStartupInfo;
PI: TProcessInformation;
S: string;
Len: Integer;
begin
Wnd:=0;
FillChar(SI, SizeOf(SI),0);
SI.cb:=SizeOf(SI);
CreateProcess(nil,"CALC.EXE",nil,nil,False,
0,nil,nil,SI,PI);
WaitForInputIdle(PI.hProcess, INFINITE);
EnumThreadWindows(PI.dwThreadId,
@EnumThreadWndProc, LPARAM(@Wnd));
begin
GetWindowTextLength(Wnd);
Len:=GetWindowTextLength(Wnd) + 1;
setlength(S, Len);
setlength(S, GetWindowText(Wnd, @s[1], Len));
Caption:=S;
end;
end;
← →
RaPToR_1 (2004-08-30 15:29) [12]пасиб, отлично работает
Страницы: 1 вся ветка
Текущий архив: 2004.09.12;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.033 c