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

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

->>> Как сделать активным процесс, зная его хэндл. [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]

А что значит активным ?


Наверх

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