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

Вниз

Активизация окна   Найти похожие ветки 

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

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

Наверх




Память: 0.51 MB
Время: 0.011 c
1-33149
zam
2003-07-28 11:10
2003.08.11
Работа с Toolbar


1-33172
Совенок
2003-07-28 06:28
2003.08.11
указать размер полей Word-документа


1-33165
LKJJed3
2003-07-28 15:01
2003.08.11
Как правильно работать с hlp файлами?


1-33179
avkiev
2003-07-28 12:32
2003.08.11
Как при отладке не вываливаться в оболочку ?


14-33331
Scorpx
2003-07-25 09:08
2003.08.11
Согласны ли Вы с данной фразой?