Форум: "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