Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.013 c
11-1115405944
SuphEr
2005-05-06 22:59
2005.12.25
PThread leak


14-1133767491
Кабан
2005-12-05 10:24
2005.12.25
Спектр


2-1133770782
inew
2005-12-05 11:19
2005.12.25
Оптимизация клиент-серверного приложения.


2-1133957542
Aleks
2005-12-07 15:12
2005.12.25
Как узнать существует папка или нет??


5-1118656499
Subdigger
2005-06-13 13:54
2005.12.25
TDataset





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский