Форум: "WinAPI";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
ВнизАктивизация окна Найти похожие ветки
← →
Degobar (2003-06-08 18:06) [0]Привет читатель и помощник,
я хочу спросить у вас вот что
Мне нужно из моего приложения
запуститить другое ( Winamp), и вернуть
фокус на мою форму (т.е. сделать ее активной)
но у меня получается
если я к событию OnClick на кнопке
привязываю следующее
procedure TForm1.Button1Click(Sender: TObject);
begin
WinExec(Pchar("c:\Program Files\Winamp3\Studio.exe"),SW_HIDE);
SetForegroundWindow(Application.Handle);
end;
если же я это сделаю, но с использованием
таймера то это не получается
procedure TForm1.Timer1Timer(Sender: TObject);
begin
WinExec(Pchar("c:\Program Files\Winamp3\Studio.exe"),SW_HIDE);
SetForegroundWindow(Application.Handle);
end;
это уже не работает,
кто сможет помочь моему горю,
а может объяснить проблему
Спасибо
← →
DVM (2003-06-08 18:14) [1]Все дело в том, что в Microsoft решили, что фокус ввода окнам может передавать только пользователь. Действительно, например, ввожу я не глядя на экран текст, а в это время там выскакивает какое-либо окно, забирает фокус ввода и все мои нажатия (а например, пароль) уходят неизвестно куда.
Но выход есть:
function ForceForegroundWindow(hWnd: THandle): Boolean;
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
← →
Degobar (2003-06-08 18:22) [2]DVM, спасибо за решение
но оно работает на половину
Winamp конечно прячется за
мою форму но она все равно не получает фокус
← →
DVM (2003-06-08 18:26) [3]SetFocus(контрол на форме) после написанного выше не поможет?
← →
Degobar (2003-06-08 18:31) [4]Непомогает SetFocus,
слушай, а по просче нельзя,
допустим послать сообщение
форме что мышкой ткнули в него, а или это глупо ?
← →
DVM (2003-06-08 18:35) [5]
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> WinExec(Pchar("c:\Program Files\Winamp3\Studio.exe"),SW_HIDE);
> SetForegroundWindow(Application.Handle);
> end;
А ты вообще тот Handle используешь? Почему Application.Handle, а не , например, Form1.handle. Не в этом ли ошибка?
← →
Degobar (2003-06-08 18:37) [6]Да уя же не знаю что туда писать,
все уже попробывал, неполучается
и все тут, я уже все нервы себе извел
скоро туда почтовый адрес впишу
← →
DVM (2003-06-08 18:41) [7]У меня работает. Взял форму, кнопку, текстовое поле. Нажимаю кнопку - запускаю винамп, фокус возвращается на мою форму в текстовое поле.
← →
Degobar (2003-06-08 18:46) [8]У тебя(Вас) запуск привязан на нажатие
кнопки, а если взять таймер (что мышкой в форму не тыкать)
и с ним попробывать, то наверное неполучиться
← →
DVM (2003-06-08 19:00) [9]Удалено модератором
Примечание: Личная переписка
← →
Degobar (2003-06-08 19:05) [10]Удалено модератором
Примечание: Личная переписка
← →
DVM (2003-06-08 20:43) [11]А у меня и с таймером все нормально работает:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
WinExec("c:\Program Files\Winamp\winamp.exe",SW_HIDE);
SetForegroundWindow(Form1.Handle);
Timer1.Enabled:=false;
end;
← →
Degobar (2003-06-09 12:17) [12]Ну я тогда не знаю, что делать
у меня все это не работает.
А у тебя какая система и какой Delphi ?
← →
DVM (2003-06-09 14:43) [13]
> Degobar
Windows XP PRO RUS + Delphi 6
← →
Degobar (2003-06-09 15:07) [14]А у меня Windows89 SE Eng + Delphi 3,
может в этом все дело, в XP
← →
DVM (2003-06-09 15:33) [15]
> Degobar
98 у меня тоже есть, попозже попробую, но мне кажется причина такого поведения в чем-то другом. У тебя комп быстрый? Я предполагаю, что причина в том, что винамп стартует не сразу и забирает фокус на себя ПОСЛЕ ТОГО как срабатывает строчка
> SetForegroundWindow(Form1.Handle);
Хотя он в свернутом состоянии запускается. Правда у меня он все время норовит запуститься в нормальном состоянии.
← →
Degobar (2003-06-09 17:44) [16]Т.е в свернутом, он у меня
как есть вылезает на первый план ( т.е фокус получает),
а комп у меня быстрый
Причина не в этом я даже
SetForegroundWindow(Form1.Handle)
ставил на событие таймер по прошествию 3 секунд после
запуска всеравно не работает,
но я нашел выход, я после запуска по истечению 1 секунды
посылаю Winamp"у сообщение
ShowWindow(WinampHandle,SW_MINIMIZE) и он после того
как сворачивается передает фокус обратно тому кто его
запустил
хотя этот выход мне не нравиться
но делать не чего
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c