![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
узнать hwnd
RaPToR_1 © (2004-08-30 02:00:00)i:=winexec('notepad.exe',1);
как мне узнать хендл окна, которое я запустил?
findwindow не канает для меня в этом случаи...нужен другой способ
RaPToR_1 (2004-08-30 15:29:00) [1]пасиб, отлично работает
GuAV (2004-08-30 14:12:00) [2]
> что эт такое?
То что окон больше одного.
Глянь в 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 13:15:00) [3]даже если так я получай например у окна калькулятора капшен 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;
KADAN (2004-08-30 12:57:00) [4]может stdcall
RaPToR_1 (2004-08-30 12:51:00) [5]
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;
вот тут я получаю хендл, но почему я не могу получить заголовок окна?
MetalFan (2004-08-30 12:38:00) [6]EnumThreadWindows(ProcessInfo. dwThreadId,@zxc,1);
RaPToR_1 (2004-08-30 11:41:00) [7]
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;
не работает это
GuAV (2004-08-30 10:50:00) [8]_sulent © (30.08.04 09:16) [4]
Не то. Читай внимательно вопрос. В [3] я уже дал ответ, осталось только его в код перевести.
_sulent (2004-08-30 09:16:00) [9]
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 03:19:00) [10]CreateProcess запустит приложение заместо winexec.
в lpProcessInformation будет информация о процессе и потоке
в частности hProcess и ThreadId.
ждешь, когда он закончит инициализацию
WaitForInputIdle.
ThreadId передашешь в EnumThreadWindows - она найдёт окно.
RaPToR_1 (2004-08-30 02:19:00) [11]а поподробнее?
GuAV (2004-08-30 02:11:00) [12]CreateProcess
EnumThreadWindows