Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

узнать 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо