Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-33052
S@shka
2003-07-18 12:13
2003.08.11
Выборка из IBase


11-33089
asp
2002-12-01 22:08
2003.08.11
TabControl


1-33212
ossa
2003-07-29 11:02
2003.08.11
Какая функция нужна,чтоб проверить существует ли именно папка


14-33320
Кен
2003-07-25 01:49
2003.08.11
Как сделать так, чтобы страничка открывалась в новом окне ИЕ,


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский