| Цитата(BUGOR @ 25.5.2006, 08:35) | | В таблице открытых хендлов системы до того как окно не создано никаких записей об этом окне тоже не создано, поэтому пока окно не создано, то как ты его хендл-то узнаешь? Задача unreal) |
А почему бы не подождать пока они не появятся?
| Цитата(Yanis @ 24.5.2006, 22:54) | И не дай бог чужая программа не запустится  |
Ну что, я всё должен чтоли предусматривать?
| Цитата(ВладимирЖуков @ 24.5.2006, 15:05) | | Может какнибудь через процессы или еще как-нибудь? Пожалуйста с кодом! |
Пожалуйста:
| Код | uses TlHelp32;
function GetProcessName(PID: Cardinal): string; var Snap: dword; Process: TPROCESSENTRY32; begin Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if Snap <> INVALID_HANDLE_VALUE then begin Process.dwSize := SizeOf(TPROCESSENTRY32); if Process32First(Snap, Process) then repeat if Process.th32ProcessID = PID then begin Result := Process.szExeFile; CloseHandle(Snap); Exit; end; until not Process32Next(Snap, Process); Result := ''; CloseHandle(Snap); end; end;
function FindWindowByExeName(ExeName: string): Hwnd; var wnd: HWnd; PID : Cardinal; begin wnd := GetWindow(Application.Handle, GW_HWNDFIRST); while wnd > 0 do begin GetWindowThreadProcessId(wnd, PID); if GetProcessName(PID) = ExeName then begin Result := wnd; Exit; end else wnd := GetWindow(wnd, GW_HWNDNEXT); end; Result := 0; end;
...
procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(IntToStr(FindWindowByExeName(ExtractFileName (Application.ExeName)))+' - '+IntToStr(Handle)); end;
|
Зацикли FindWindowByExeName по аналогии с FindWindow. Если есть вероятность, что программа может не запуститься, то, во-первых, проверь что возвратил WinExec (если используешь его), если значение больше 31, то всё окей, иначе - ошибка. Во-вторых, ограничь по времени поиск окна, ну например секунд 5 (сгодится даже TTimer с закладки System). |