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

Вниз

как вытащить окно на передний план и ...   Найти похожие ветки 

 
MetalFan ©   (2004-04-21 12:15) [0]

перевести на него фокус?
procedure TfmMainDB.DoRestoreApp;
begin
    if IsIconic(Application.Handle) then
    begin
      ShowWindow(Application.Handle, SW_SHOW);
      Application.Restore;
    end;
    SetForegroundWindow(Handle);
end;

если приложение было свернуто, то все ОК!
а если оно просто было на заднем фоне - то кнопка в таскбаре мигает, а приложение остается позади всех окон((((


 
Игорь Шевченко ©   (2004-04-21 12:32) [1]

SystemParametersInfo (SPI_SETFOREGROUNDLOCKTIMEOUT, ....)


 
DVM ©   (2004-04-21 12:39) [2]

SwitchToThisWindow()


 
Игорь Шевченко ©   (2004-04-21 12:42) [3]

DVM ©   (21.04.04 12:39)

А теперь начнутся вопросы, где ее взять :)


 
MetalFan ©   (2004-04-21 13:11) [4]


> Игорь Шевченко ©   (21.04.04 12:42) [3]
> DVM ©   (21.04.04 12:39)
>
> А теперь начнутся вопросы, где ее взять :)

а где ее взять ? )))


 
DVM ©   (2004-04-21 13:14) [5]

procedure SwitchToThisWindow(wnd : HWND; bRestore: BOOL); stdcall;
           external "user32.dll" name "SwitchToThisWindow";
wnd
описатель окна, которому следует передаь фокус;
bRestore
TRUE, если нужно восстановить минимизированное окно.
Чтобы использовать эту функцию, просто скопируйте её определение, данное выше, в любое место программы вне основного кода.


 
MetalFan ©   (2004-04-21 14:38) [6]


> DVM ©   (21.04.04 13:14) [5]
> procedure SwitchToThisWindow(wnd : HWND; bRestore: BOOL);
> stdcall;
>            external "user32.dll" name "SwitchToThisWindow";

такое же повеление, как и при SetForegroundWindow


 
MetalFan ©   (2004-04-21 14:44) [7]

прошу прощенья! работает, если второй параметр false, но окно остается неактивным...


 
DDA ©   (2004-04-21 22:49) [8]

function ForceForegroundWindow(hwnd: THandle): boolean;
const
SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
ForegroundThreadID: DWORD;
ThisThreadID: DWORD;
timeout: DWORD;
begin
if IsIconic(hwnd) then
  ShowWindow(hwnd, SW_RESTORE);

if GetForegroundWindow = hwnd then
  Result := True
else
begin
  // Windows 98/2000 doesn"t want to foreground a window when some other
  // window has keyboard focus
  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
    // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
    // Converted to Delphi by Ray Lischner
    // Published in The Delphi Magazine 55, page 16
    Result := False;
    ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow,
      nil);
    ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
    if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
    begin
      BringWindowToTop(hwnd); // IE 5.5 related hack
      SetForegroundWindow(hwnd);
      AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
      Result := (GetForegroundWindow = hwnd);
    end;

    if not Result then
    begin
      // Code by Daniel P. Stasinski
      SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
      SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0), SPIF_SENDCHANGE);
      BringWindowToTop(hwnd); // IE 5.5 related hack
      SetForegroundWindow(hWnd);
      SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
    end;
  end
  else
  begin
    BringWindowToTop(hwnd); // IE 5.5 related hack
    SetForegroundWindow(hwnd);
  end;

  Result := (GetForegroundWindow = hwnd);
end;
end; { ForceForegroundWindow }

-----------------------
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 ForceForegroundWindow(Application.Handle);
end;


 
Sur ©   (2004-04-21 23:19) [9]

SetForegroundWindow(Handle) или
BringWindowToTop(Handle)


 
Slym ©   (2004-04-22 05:17) [10]

Application.BringToFront!


 
DVM ©   (2004-04-22 09:04) [11]


> Sur ©   (21.04.04 23:19) [9]
> SetForegroundWindow(Handle) или
> BringWindowToTop(Handle)
>
>
> Slym ©   (22.04.04 05:17) [10]
> Application.BringToFront!

Ни то не другое не сработает в Win2000 на 100 %


 
Cobalt ©   (2004-04-22 09:24) [12]

2 DVM ©   (22.04.04 09:04) [11]
А передача фокуса окну?


 
BaDeVlad ©   (2004-04-22 09:31) [13]

Какой ужас! А зачем окно СВОЕЙ программы делать активным посредством посылки сообщений? Или я чегой-то недопонял? Можно же сделать Show и все должно получиться?


 
DVM ©   (2004-04-22 09:32) [14]


> Cobalt ©   (22.04.04 09:24) [12]

В win2000 в работу всех этих функций введено небольшое "новшество". Окно теперь не может просто так вылезти наверх и забрать фокус. Ну представьте: вы печатаете пароль - вылезает программка и забирает ваши нажатия в свое окно. Или просто набирали тест - вылезло чужое окно и все ваши нажатия ушли в никуда. Потому переключится на окно с передачей фокуса и выводом его на передний план можно либо [1] оно же в [8] (код с torry.net) либо [2].


 
Dimka Maslov ©   (2004-04-22 09:32) [15]

http://delphibase.endimus.com/?action=viewfunc&topic=appctrl&id=10031


 
DVM ©   (2004-04-22 09:32) [16]


> Можно же сделать Show и все должно получиться?

нет.


 
BaDeVlad ©   (2004-04-22 09:39) [17]

Application.BringToFront


 
DVM ©   (2004-04-22 09:42) [18]


> BaDeVlad ©   (22.04.04 09:39) [17]

Если ваше окно будет свернуто, перекрыто другими, и потом вздумает вылезти, это не поможет. Иногда будет получаться, но далеко не всегда. К тому же поглядите [10].


 
Dimka Maslov ©   (2004-04-22 09:43) [19]

>BaDeVlad ©   (22.04.04 09:39) [17]
В этом случае просто заморгает значок


 
MetalFan ©   (2004-04-22 10:00) [20]

пожалуй [8] более "красивый" код, чем в ссылке по [15]


 
DVM ©   (2004-04-22 10:12) [21]


> пожалуй [8] более "красивый" код, чем в ссылке по [15]

Скажи лучше более навороченный. Там куча лишних строчек. :)
Но он рабочий на 100% я проверял его давно как-то.


 
MetalFan ©   (2004-04-22 10:33) [22]

2 DVM
ну и более навороченный конечно!

Всем спасибо за советы!



Страницы: 1 вся ветка

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

Наверх





Память: 0.5 MB
Время: 0.033 c
7-1082550689
химик
2004-04-21 16:31
2004.05.30
Как программно добавить язык (раскладку) в системе?


4-1081600941
Dron
2004-04-10 16:42
2004.05.30
Как изменить имя каталога


4-1081955470
AndersoNRules
2004-04-14 19:11
2004.05.30
Kak pravilino UBIVATI TThread i ?


3-1084345256
--Kostik--
2004-05-12 11:00
2004.05.30
Как в TQuery узнать порядковый номер текущей записи?


6-1081295507
juggler
2004-04-07 03:51
2004.05.30
IEParser и событие OnNewWindow2





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