Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

Как передать фокус другой программе?   Найти похожие ветки 

 
Alex_C ©   (2005-10-25 09:55) [0]

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


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

Alex_C ©   (25.10.05 09:55)

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


 
ANB ©   (2005-10-25 10:14) [2]


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

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


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

ANB ©   (25.10.05 10:14) [2]

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

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

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


 
DVM ©   (2005-10-25 10:27) [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:29) [5]

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


 
ssk ©   (2005-10-25 15:18) [6]

SetActiveWindow ?


 
Leonid Troyanovsky ©   (2005-10-25 15:50) [7]


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


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

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
2-1133372806
SpyBoy
2005-11-30 20:46
2005.12.25
*.pwl


2-1134335155
RX
2005-12-12 00:05
2005.12.25
TTree


2-1133963050
cp.Silver
2005-12-07 16:44
2005.12.25
THandle


14-1133610447
alex31
2005-12-03 14:47
2005.12.25
HTTP SERVER


2-1134256939
Antony17
2005-12-11 02:22
2005.12.25
Запуск стандартных процедур