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

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

Как передать фокус другой программе? [D7, WinXP]


Alex_C ©   (2005-10-25 09:55:00) 

Как передать фокус другой программы?
Пробовал:
ShowWindow( FindWindow('Prog', nil), SW_SHOW );
и так
PostMessage( FindWindow('Prog', nil), wm_setfocus, 0, 0 );
ничего не получилось - фокус не передается
Вешал эти события на OnKeyDown


Leonid Troyanovsky   (2005-10-25 15:50:00) [1]


> ssk ©   (25.10.05 15:18) [6]
> SetActiveWindow ?


Нет.
Поток другой.

--
Regards, LVT.


ssk   (2005-10-25 15:18:00) [2]

SetActiveWindow ?


ИА   (2005-10-25 10:29:00) [3]

В зависимости от состояния окна приложения, которое вы хотите активировать, используется SW_SHOWNORMAL (IsIconic == true) или SW_RESTORE (IsIconic == false)


DVM   (2005-10-25 10:27:00) [4]

function ForceForegroundWindow(hWnd: HWND): BOOL;
const
 SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
 SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
 OsVerInfo: TOSVersionInfo;
 Win32MajorVersion: Integer;
 Win32MinorVersion: Integer;
 Win32Platform: Integer;
 ForegroundThreadID: DWORD;
 ThisThreadID: DWORD;
 Timeout: DWORD;
begin
 OsVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
 GetVersionEx(osVerInfo);
 Win32MajorVersion := OsVerInfo.dwMajorVersion;
 Win32MinorVersion := OsVerInfo.dwMinorVersion;
 Win32Platform := OsVerInfo.dwPlatformId;
 if IsIconic(hWnd) then ShowWindow(hWnd, SW_RESTORE);
 if GetForegroundWindow = hWnd then Result := True
 else
 begin
   if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
     ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and ((Win32MajorVersion > 4)
       or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)))) then
   begin
     Result := False;
     ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
     ThisThreadID := GetWindowThreadPRocessId(hWnd, nil);
     if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
     begin
       BringWindowToTop(hWnd);
       SetForegroundWindow(hWnd);
       AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
       Result := (GetForegroundWindow = hWnd);
     end;
     if not Result then
     begin
       SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @Timeout, 0);
       SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
         SPIF_SENDCHANGE);
       BringWindowToTop(hWnd);
       SetForegroundWindow(hWnd);
       SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(Timeout),
                                                              SPIF_SENDCHANGE);
     end;
   end
   else
   begin
     BringWindowToTop(hWnd);
     SetForegroundWindow(hWnd);
   end;
   Result := (GetForegroundWindow = hWnd);
 end;
end; // End of function ForceForegroundWindow


Ботвин Дмитрий   (2005-10-25 10:20:00) [5]

ANB ©   (25.10.05 10:14) [2]

В ХР ситуация примерно такая, наскока я понял из различных источников:

Если окно, которому надо передать фокус (сделать активным), принадлежит
потоку твоего процесса, тогда микрософт рекомендует использовать функцию BringWindowToTop, а если чужому - SetForegroundWindow.

Во всяком случае, у меня при таком подходе и под 2к и под ХР железно прокатывает.


ANB   (2005-10-25 10:14:00) [6]


> Ботвин Дмитрий   (25.10.05 10:02) [1]

В XP эта функция не всегда (точнее почти никогда) отрабатывает.
Автору - что имеем в виду под термином "передать фокус" ? Сделать окно активным ?


Ботвин Дмитрий   (2005-10-25 10:02:00) [7]

Alex_C ©   (25.10.05 09:55)

BOOL SetForegroundWindow(
   HWND hWnd  // handle of window to bring to foreground
  );


Наверх

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