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

Вниз

Форма поверх других окон   Найти похожие ветки 

 
Zloy ©   (2005-05-11 16:15) [0]

спрятал я форму, поместил на трее значок, при нажатии на трей вызывается Form1.Show, форма ставновится видной, но не активной, а надо что бы стала активной, и если выбрана другая прога, чтобы она потеряла фокус а не была все время активной... помогите советом плиз. а то нахожу способо но она всегда поверх все окон.


 
Eraser ©   (2005-05-11 16:31) [1]

Zloy ©

Это так специально сделали, по-моему с win2k начиная, чтобы всякие окошки не мешали работать юзеру с текущей программой.


 
alpet ©   (2005-05-11 16:33) [2]

След. функции нужны:
GetForegroundWindow, GetWindowThreadProcessId
AttachThreadInput, SetForegroundWindow, SetActiveWindow.


 
DVM ©   (2005-05-11 16:51) [3]

{
 Windows 98/2000 doesn"t want to foreground a window when
 some other window has the keyboard focus.
 ForceForegroundWindow is an enhanced SetForeGroundWindow/bringtofront
 function to bring a window to the front.
}

{
 Manchmal funktioniert die SetForeGroundWindow Funktion
 nicht so, wie sie sollte; besonders unter Windows 98/2000,
 wenn ein anderes Fenster den Fokus hat.
 ForceForegroundWindow ist eine "verbesserte" Version von
 der SetForeGroundWindow API-Funktion, um ein Fenster in
 den Vordergrund zu bringen.
}

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 }

// 2. Way:
//**********************************************

procedure ForceForegroundWindow(hwnd: THandle);
 // (W) 2001 Daniel Rolf
 // http://www.finecode.de
 // rolf@finecode.de
var
 hlp: TForm;
begin
 hlp := TForm.Create(nil);
 try
   hlp.BorderStyle := bsNone;
   hlp.SetBounds(0, 0, 1, 1);
   hlp.FormStyle := fsStayOnTop;
   hlp.Show;
   mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
   mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
   SetForegroundWindow(hwnd);
 finally
   hlp.Free;
 end;
end;

// 3. Way:
//**********************************************
// by Thomas Stutz

{
 As far as you know the SetForegroundWindow function on Windows 98/2000 can
 not force a window to the foreground while the user is working with another window.
 Instead, SetForegroundWindow will activate the window and call the FlashWindowEx
 function to notify the user. However in some kind of applications it is necessary
 to make another window active and put the thread that created this window into the
 foreground and of course, you can do it using one more undocumented function from
 the USER32.DLL.

 void SwitchToThisWindow (HWND hWnd,  // Handle to the window that should be activated
 BOOL bRestore // Restore the window if it is minimized
);

}

procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall;
 external user32 Name "SwitchToThisWindow";
        {x = false: Size unchanged, x = true: normal size}

procedure TForm1.Button2Click(Sender: TObject);
begin
 SwitchToThisWindow(FindWindow("notepad", nil), True);
end;



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

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

Наверх




Память: 0.49 MB
Время: 0.039 c
1-1119358489
intaari
2005-06-21 16:54
2005.07.11
Прога не находит класс при старте программы


14-1118041063
ПЛОВ
2005-06-06 10:57
2005.07.11
MMS


14-1118212934
вразлет
2005-06-08 10:42
2005.07.11
Ukraine under attack


3-1117423325
akhmadey
2005-05-30 07:22
2005.07.11
Сортировка по lookup-полю


3-1117024028
evg00
2005-05-25 16:27
2005.07.11
последняя запись