![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
->>> Как сделать активным процесс, зная его хэндл. [Win95/98, WinME, NT4, Win2k]
Metallica © (2002-08-21 13:17:00)Как сделать активным процесс, зная его хэндл.
Ученик (2002-08-22 23:34:00) [1]Еще вариант, проверял на Windows 2000
procedure TForm1.Timer1Timer(Sender: TObject);
begin
EnableWindow(Application.Handle, False);
Application.Minimize;
Application.Restore;
EnableWindow(Application.Handle, True);
SetForegroundWindow(Handle)
end;
Metallica (2002-08-22 19:46:00) [2]Ученик © (21.08.02 18:36)
А если я нахожусь в Досовской задаче, как мне вывалиться в Винду программно?
Игорь Шевченко (2002-08-22 13:47:00) [3]sudiv © (22.08.02 11:49)
У приложения может быть много окон :-)))
sudiv (2002-08-22 11:49:00) [4]to Игорь Шевченко © (21.08.02 16:49)
Окна, окна с кем не бывает ? :)
Ученик (2002-08-21 18:36:00) [5]>Metallica (21.08.02 18:34)
Это, по таймеру
procedure TForm1.Timer1Timer(Sender: TObject);
var
hForeGround : HWnd;
begin
hForeGround := GetForegroundWindow;
AttachThreadInput(GetWindowThreadProcessId(hForeGround, nil),
GetWindowThreadProcessId(Handle, nil), True);
SetForegroundWindow(Handle);
end;
Metallica (2002-08-21 18:34:00) [6]Ученик © (21.08.02 17:10)
> Свое или чужое ? :)
Для начала, свое.
Ученик (2002-08-21 17:10:00) [7]>Metallica (21.08.02 17:00)
Свое или чужое ? :)
Metallica (2002-08-21 17:00:00) [8]Мужики, всеравно ничего не получается. Кнопка приложения на ТаскБаре мигать и все.
Игорь Шевченко (2002-08-21 16:49:00) [9]У приложения Handle нету :-)))
paul_shmakov (2002-08-21 16:33:00) [10]2 sudiv:
хэндл процесса и хэндл окна - это абсолютно разные вещи :)
"Metallica (21.08.02 13:17)
Как сделать активным процесс, зная его хэндл."
sudiv (2002-08-21 14:31:00) [11]to Ученик © (21.08.02 14:28)
Ну так ведь я тоже ученик,
делал так и все работало, предварительно поискав в списке запущенных приложений нужный хендл.
Насколько понял из вопроса нужно поднять из фона именно приложение.
Ученик (2002-08-21 14:28:00) [12]>sudiv © (21.08.02 14:22)
:)
sudiv (2002-08-21 14:22:00) [13]to Ученик © (21.08.02 14:20)
приложения
Ученик (2002-08-21 14:20:00) [14]>sudiv © (21.08.02 14:17)
На Handle процесса ?
sudiv (2002-08-21 14:17:00) [15]Ого.
Может проще:
ShowWindow(Handle, SW_RESTORE);
SetForegroundWindow(Handle);
Или даже просто
ShowWindow(Handle, SW_RESTORE);
Ученик (2002-08-21 13:48:00) [16]Не совсем по Handle, но идентификатор, наверно, известен
{ Project JEDI Code Library (JCL)}
function IsMainAppWindow(Wnd: HWND): Boolean;
var
ParentWnd: HWND;
ExStyle: DWORD;
begin
if IsWindowVisible(Wnd) then
begin
ParentWnd := GetWindowLong(Wnd, GWL_HWNDPARENT);
ExStyle := GetWindowLong(Wnd, GWL_EXSTYLE);
Result := ((ParentWnd = 0) or (ParentWnd = GetDesktopWindow)) and
((ExStyle and WS_EX_TOOLWINDOW = 0) or (ExStyle and WS_EX_APPWINDOW <> 0));
end
else
Result := False;
end;
function GetMainAppWndFromPid(PID: DWORD): HWND;
type
PSearch = ^TSearch;
TSearch = record
PID: DWORD;
Wnd: HWND;
end;
var
SearchRec: TSearch;
function EnumWindowsProc(Wnd: HWND; Res: PSearch): Boolean; stdcall;
var
WindowPid: DWORD;
begin
WindowPid := 0;
GetWindowThreadProcessId(Wnd, @WindowPid);
if (WindowPid = Res^.PID) and IsMainAppWindow(Wnd) then
begin
Res^.Wnd := Wnd;
Result := False;
end
else
Result := True;
end;
begin
SearchRec.PID := PID;
SearchRec.Wnd := 0;
EnumWindows(@EnumWindowsProc, Integer(@SearchRec));
Result := SearchRec.Wnd;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
SetForegroundWindow(GetMainAppWndFromPid(dwProcessID))
end;
Metallica (2002-08-21 13:28:00) [17]Ученик © (21.08.02 13:21)
> А что значит активным ?
1. Установить фокус на данный процесс (приложение).
Если это непонятно, то объясняю еще...
2. Вывести приложение на передний план.
Ученик (2002-08-21 13:21:00) [18]А что значит активным ?